How to insert records into variables from cte in oracle?

跟風遠走 提交于 2020-04-17 21:26:49

问题


I have a procedure in which I want to fetch all records from cte into Names variable. But this code is not writing into names from CTE. How can I fetch records into names so that I can later loop through names and get content of 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;

回答1:


SELECT sqql into Names from CTE;

You are assigning multiple rows returned from table to a variable, which will fail.

You could simply use a CURSOR FOR LOOP which will create an implicit cursor and you can loop through the names:

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:


I think your best bet is to create a associative array and use BULK COLLECT to populate the table. In its simplest form, the code would look like this:

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;
/

A few notes:

  • I'm assuming that you've set MAX_STRING_SIZE to EXTENDED. Otherwise, you'll have an issue with VARCHAR2 that big.
  • As I said, that is the simplest way to do this. If you're expecting a huge result set, you'll want to look into chunking it up. This Oracle blog post is very helpful in giving you multiple options for how to perform bulk processing. (Blog Post)


来源:https://stackoverflow.com/questions/61144754/how-to-insert-records-into-variables-from-cte-in-oracle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!