【问题标题】: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)

      【讨论】:

        猜你喜欢
        • 2022-09-25
        • 1970-01-01
        • 2014-05-26
        • 2014-08-06
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        相关资源
        最近更新 更多