Я хочу объявить курсор на таблице, которая не существует. Конечно, моя процедура не компилирует.
Эта таблица является временной таблицей и составлена пред процесс. Это будет существовать на времени выполнения, но во время компиляции его другой истории.
Для моего выбора / обновляет другой DML операции, я использовал
EXECUTE IMMEDIATE 'operation from tmp_table'
но я не могу найти обходное решение для курсоров.
Существует ли путь?
В основном я хочу, чтобы это скомпилировало
drop table test;
/*from this on should compile*/
DECLARE
cursor c is select * from test;
BEGIN
for reg in c LOOP
/*...*/
END LOOP;
END;
До сих пор не компиляция:
SQL> declare
2 c sys_refcursor;
3 BEGIN
4 open c for 'select * from pepito'; -- 'pepito' does not exist
5 close c;
6 end;
7 /
declare
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 4
Должен использовать CREATE PROCEDURE, спасибо.
Заранее спасибо.
Вы должны иметь возможность определять свой курсор следующим образом:
DECLARE
c SYS_REFCURSOR;
BEGIN
OPEN c FOR 'SELECT * FROM dual';
CLOSE c;
END;
Вы также можете связывать аргументы:
OPEN c FOR 'SELECT * FROM dual WHERE DUMMY = :1' USING 'X';
Для получения дополнительной информации см. Документацию Oracle по оператору OPEN-FOR .
Пример использования хранимой процедуры
CREATE OR REPLACE PROCEDURE test IS
c SYS_REFCURSOR;
BEGIN
OPEN c FOR 'SELECT * FROM fdfdfdfdfd';
CLOSE c;
END;
/
Вы можете использовать DBMS_SQL, чтобы получить еще большую гибкость, чем метод курсора ref, описанный Питером Лэнгом. Но это означает, что нужно больше работать.
Создание временных таблиц, как требуется, обычно не считается хорошей практикой в Oracle, где глобальные временные таблицы лучше и не вызовут этой проблемы
.