В PL/SQL вам нужно вывести запрос SQl INTO
переменной.
Однако, поскольку этот запрос будет генерировать несколько строк, вы, вероятно, захотите использовать BULK COLLECT INTO
, а не только INTO
, и поместить вывод в определяемую пользователем коллекцию или VARRAY
(примером которой является SYS.ODCIVARCHAR2LIST
). Примечание: вы не можете использовать оператор MEMBER OF
с VARRAY
):
DECLARE
list_of_improvs SYS.ODCIVARCHAR2LIST;
BEGIN
SELECT regexp_substr(improv,'[^,]+', 1, level)
BULK COLLECT INTO list_of_improvs
FROM DUAL
CONNECT BY regexp_substr(improv, '[^,]+', 1, level) is not null;
END;
/
Обновление:
В ответ на ваш комментарий - вы можете использовать его так (хотя неясно, чего вы пытаетесь достичь, поэтому я просто поместил ваш код во фрагмент, не пытаясь понять, что вы собираетесь делать):
DECLARE
list_of_improvs SYS.ODCIVARCHAR2LIST;
BEGIN
SELECT regexp_substr(improv,'[^,]+', 1, level)
BULK COLLECT INTO list_of_improvs
FROM DUAL
CONNECT BY regexp_substr(improv, '[^,]+', 1, level) is not null;
FOR i IN 1 .. list_of_improvs.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( improvs(i) );
END LOOP;
update line_cap
set cap_up = list_of_improvs(1)
where id IN ( SELECT Column_Value
FROM TABLE( list_of_improvs ) );
END;
/
Вы не можете использовать IN
напрямую с коллекцией или VARRAY и должны использовать выражение коллекции TABLE()
во вложенном запросе, чтобы получить значения.
Если вы используете определяемую пользователем коллекцию SQL, то есть определенную с помощью такого оператора:
CREATE TYPE StringList IS TABLE OF VARCHAR2(4000);
Затем вы можете использовать оператор MEMBER OF
:
DECLARE
list_of_improvs StringList;
BEGIN
-- as above
update line_cap
set cap_up = list_of_improvs(1)
where id MEMBER OF list_of_improvs;
END;
/
Но вы не можете использовать оператор MEMBER OF
с VARRAY
s (например, SYS.ODCIVARCHAR2LIST
).
Однако для этого вам не нужен PL/SQL (и исключить дорогостоящие переключения контекста между областями выполнения PL/SQL и SQL) и можно просто использовать оператор MERGE
, например:
MERGE INTO line_cap dst
USING (
SELECT MIN( value ) KEEP ( DENSE_RANK FIRST ORDER BY ROWNUM ) OVER () AS first_value,
value
FROM (
SELECT regexp_substr(improv,'[^,]+', 1, level) AS value
FROM DUAL
CONNECT BY regexp_substr(improv, '[^,]+', 1, level) is not null
)
) src
ON ( src.value = dst.id )
WHEN MATCHED THEN
UPDATE
SET cap_up = first_value;
person
MT0
schedule
18.01.2018
INTO
в некоторой переменной в блоке PL/SQL. - person Aleksej   schedule 18.01.2018select regexp_substr(improv,'[^,]+', 1, level) from dual connect by regexp_substr(improv, '[^,]+', 1, level) is not null into my_table;
, но получил команду sql ошибки компиляции, которая не закончилась должным образом между нулем и в - person Matin   schedule 18.01.2018'[^,]+'
не допускает элементов списка NULL и возвращает неправильный элемент, если встречается NULL. Дополнительную информацию см. здесь: stackoverflow.com/a/31464699/2543416. Вместо этого используйте эту форму (11g и более поздние версии):regexp_substr(improv,'(.*?)(,|$)', 1, level, NULL, 1)
- person Gary_W   schedule 18.01.2018