9

存在しないテーブルにカーソルを宣言したい。もちろん、私のプロシージャはコンパイルされません。

このテーブルは一時的なテーブルであり、前処理によって作成されます。実行時に存在しますが、コンパイル時に別の話になります。

他の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

おかげで、CREATEPROCEDUREを使用する必要があります。

前もって感謝します。

4

3 に答える 3

8

次のようにカーソルを定義できるはずです。

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';

詳細については、OPEN-FOR ステートメントの Oracle ドキュメントを参照してください。

ストアド プロシージャを使用した例

CREATE OR REPLACE PROCEDURE test IS
  c SYS_REFCURSOR;
BEGIN
  OPEN c FOR 'SELECT * FROM fdfdfdfdfd';
  CLOSE c;
END;
/
于 2009-12-21T19:34:23.303 に答える
3

DBMS_SQL を使用すると、Peter Lang が説明した ref カーソル方式よりもさらに柔軟性が得られます。しかし、それはより多くの仕事も意味します。

于 2009-12-21T19:58:43.133 に答える