【问题标题】:How to insert records into variables from cte in oracle?如何将记录插入到oracle中cte的变量中?
【发布时间】:2020-04-10 16:43:43
【问题描述】:
我有一个过程,我想在其中将所有记录从 cte 提取到 Names 变量中。但是这段代码并没有写入 CTE 的名称。如何将记录提取到名称中,以便以后循环遍历名称并获取 field_name 的内容?
CREATE OR REPLACE PROCEDURE sp_market
IS
Names VARCHAR2(32767);
BEGIN
WITH CTE(sqql) As
(
SELECT field_name sqql FROM pld_medicare_config
)
SELECT sqql into Names from CTE;
END sp_market;
【问题讨论】:
标签:
oracle
stored-procedures
plsql
【解决方案1】:
从 CTE 中选择 sql 到名称中;
您将从表返回的多行分配给一个变量,这将失败。
您可以简单地使用 CURSOR FOR LOOP 来创建一个隐式游标,并且您可以遍历名称:
CREATE OR REPLACE PROCEDURE sp_market IS
BEGIN
FOR i IN (
SELECT field_name
FROM pld_medicare_config
)
LOOP
-- Your logic goes here
dbms_output.put_line(i.field_name);
END LOOP;
END;
/
【解决方案2】:
我认为你最好的选择是创建一个关联数组并使用BULK COLLECT 来填充表格。最简单的代码如下所示:
CREATE OR REPLACE PROCEDURE sp_market IS
TYPE lt_names IS TABLE OF VARCHAR2(32767) INDEX BY PLS_INTEGER;
l_tNames lt_names;
BEGIN
SELECT field_name
BULK COLLECT INTO l_tNames
FROM pld_medicare_config
IF l_tNames.COUNT() > 0 THEN
FOR i IN l_tNames.FIRST..l_tNames.LAST LOOP
NULL; --REPLACE WITH YOUR LOGIC
END LOOP;
END IF;
END;
/
几点说明:
- 我假设您已将 MAX_STRING_SIZE 设置为 EXTENDED。否则,
VARCHAR2 会有这么大的问题。
- 正如我所说,这是最简单的方法。如果您期待一个巨大的结果集,您将需要考虑将其分块。这篇 Oracle 博客文章非常有助于为您提供如何执行批量处理的多种选择。 (Blog Post)