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

应该使用 CREATE PROCEDURE,谢谢。

提前致谢。

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 回答
5

根据需要创建临时表在 Oracle 中通常不被认为是好的做法,其中全局临时表更好并且不会导致此问题

于 2009-12-21T22:55:34.927 回答
3

您可以使用 DBMS_SQL 获得比 Peter Lang 描述的引用游标方法更大的灵活性。但这也意味着更多的工作。

于 2009-12-21T19:58:43.133 回答