Как вставить записи в переменные из cte в oracle? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть процедура, в которой я хочу получить все записи из cte в переменную Names. Но этот код не записывает имена из CTE. Как я могу извлечь записи в имена, чтобы потом я мог l oop через имена и получать содержимое 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;

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Я думаю, что вам лучше всего создать ассоциативный массив и использовать 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 сообщение в блоге очень полезно, предоставляя вам несколько вариантов выполнения массовой обработки. ( Сообщение в блоге )
1 голос
/ 10 апреля 2020

ВЫБЕРИТЕ sqql в Имена из CTE;

Вы присваиваете несколько строк, возвращаемых из таблицы, переменной, что приведет к ошибке.

Вы можете просто использовать CURSOR FOR L OOP, который создаст неявный курсор, и вы можете l oop через имена:

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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...