Как воспользоваться 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
→ Ссылка