Как воспользоваться WITH FUNCTION в FOR цикле?
Не могу выполнить следующий запрос в цикле:
declare
i number(10);
begin
for i in (
with function f(x in number) return number as
begin
return x*2;
end;
select f(2) r from dual;
) loop
dbms_output.put_line(i.r);
end loop;
end;
Получаю следующую ошибку:
Error report -
ORA-06550: line 5, column 23:
PL/SQL: ORA-00905: missing keyword
Какие есть пути решения проблемы?
Свободный перевод вопроса Issue using WITH FUNCTION inside for loop от участника Ramthilak R
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Определение функций в CTE недоступно для статических запросов в PL/SQL контексте.
Для именованых объектов БД, нужно определить функцию, либо в спецификации пакета, либо как SQL функцию.
Также возможно выполнить тот же запрос как динамический SQL. Для анонимных блоков это даже предпочтительней, так как они сами по себе являются динамическими запросами. Например так:
declare
type nt is table of number;
nums nt;
begin
execute immediate q'[
with function f(x in number) return number as
begin
return x*2;
end;
select f (rownum) r from xmlTable ('1 to 3')]' bulk collect into nums;
for i in 1..nums.count loop
dbms_output.put_line (nums(i)); end loop;
end;
/
2
4
6