Oracle PLSQL - объявить курсор на несуществующей таблице - PullRequest
7 голосов
/ 21 декабря 2009

Я хочу объявить курсор на несуществующей таблице. Конечно, моя процедура не компилируется.

Эта таблица является временной таблицей и создается предварительным процессом. Он будет существовать во время выполнения, но во время компиляции это другая история.

Для выбора / обновления других операций 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, спасибо.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 21 декабря 2009

Вы должны определить курсор следующим образом:

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;
/
5 голосов
/ 22 декабря 2009

Создание временных таблиц по мере необходимости обычно не считается хорошей практикой в ​​Oracle, где глобальные временные таблицы лучше и не вызывают этой проблемы

3 голосов
/ 21 декабря 2009

Вы можете использовать DBMS_SQL, чтобы получить еще большую гибкость, чем метод ref курсора, описанный Питером Лангом. Но это также означает больше работы.

...