Ваше утверждение не совсем верно. Вы можете использовать курсор для почти произвольных запросов. Смотрите ниже:
create or replace procedure fooproc
IS
type acursor is ref cursor;
mycur acursor;
mydate date;
BEGIN
execute immediate 'create global temporary table footmp (bar date) on commit delete rows';
execute immediate 'insert into footmp values (SYSDATE)';
open mycur for 'select * from footmp';
loop
fetch mycur into mydate;
exit when mycur%notfound;
dbms_output.put_line(mydate);
end loop;
close mycur;
execute immediate 'drop table footmp';
END fooproc;
/
(Подробнее здесь - особенно этот короткий процесс вообще не безопасен, поскольку имя таблицы фиксировано и не зависит от сессии).
Это (довольно) немного уродливо, и я не предлагаю вам использовать это - скорее, вы должны подумать, нужна ли вам вообще временная таблица для конкретной процедуры.
См. эту другую статью :
НЕ создавайте их динамически [временные таблицы], НЕ создавайте их динамически, пожалуйста - НЕ создавайте их динамически.
Не могли бы вы использовать глобальную временную таблицу? Вам вообще нужен временный стол? (т.е. не использует курсор на операторе select, который вы бы использовали для заполнения этой таблицы?)