Ошибка вывода результата PL/SQL блока через DBMS_SQL.return_result

При выполнении в Oracle APEX команды:

DECLARE
    first_cursor SYS_REFCURSOR;
BEGIN
    OPEN first_cursor FOR SELECT * FROM employees;
    DBMS_SQL.return_result(first_cursor);
END;

строка DBMS_SQL.return_result(first_cursor); выдает ошибку:

Error processing condition. Error computing plan for statement.
ORA-00905: missing keyword

В чем может быть проблема?


Ответы (1 шт):

Автор решения: 0xdb

Проблема в том, что непонятно, где запускается блок. Следует учесть, что возвращаемый результат обрабатывается в клиенте. Tо есть, клиент должен неявно вызывать GET_NEXT_RESULT, обрабатывать результат и обеспечивать его вывод.

Блок из вопроса без каких либо изменений прекрасно работает, например, в SQL*Plus:

SQL> DECLARE
  2      first_cursor SYS_REFCURSOR;
  3  BEGIN
  4      OPEN first_cursor FOR SELECT * FROM employees;
  5      DBMS_SQL.return_result(first_cursor);
  6  END;
  7  /

PL/SQL procedure successfully completed.

ResultSet #1

        ID       DEPT     SALARY BEGIN_DAT END_DATE      MAN_ID
---------- ---------- ---------- --------- --------- ----------
         1         22    3500.86 01-JUL-19 01-MAY-20          1
         1         24    2000.86 01-JUN-19 01-MAY-20          2
         2         23    3500.86 01-JUN-19 01-MAY-20          2
         3         24    3500.86 01-JUN-19 01-MAY-20          3
         4         22    2000.86 01-JUN-19 01-MAY-20          3
         7         21    3500.86 01-MAY-19 01-MAY-20          1

6 rows selected.

Что эквивалентно явному возврату открытого курсора:

set autoprint on 
var rc refcursor
DECLARE
    first_cursor SYS_REFCURSOR;
BEGIN
    OPEN first_cursor FOR SELECT * FROM employees;
    :rc := first_cursor;
END;
/
→ Ссылка