Oracle PLSQL - 在不存在的表上声明游标

问题描述:

我想在不存在的表上声明游标。当然,我的程序不会编译。Oracle PLSQL - 在不存在的表上声明游标

该表是临时表,由预处理创建。它将在运行时存在,但在编译时它是另一回事。

对于我的选择/更新的其他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,谢谢。

在此先感谢。

+0

你得到的异常,因为你实际运行的代码。用'CREATE PROCEDURE test_cursor AS'替换'declare'来编译代码。 – 2009-12-21 20:01:19

+0

:facepalm 15cccc – Tom 2009-12-21 20:04:05

+0

TOAD没有编译按钮。 :S这应该是微不足道的! – Tom 2009-12-21 20:14:07

你应该能够定义你的光标这样的:

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 Statement的Oracle文档。

实施例使用存储过程

CREATE OR REPLACE PROCEDURE test IS 
    c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM fdfdfdfdfd'; 
    CLOSE c; 
END; 
/
+0

谢谢,但dual是现有的表格,我需要这样做在运行时不存在表 – Tom 2009-12-21 19:38:49

+0

错别字,它的编译时间 – Tom 2009-12-21 19:40:13

+0

我不确定你的意思,你也可以通过'SELECT * FROM some_not_existing_table'来改变提供的源代码。表仍然不存在 – 2009-12-21 19:44:37

可以使用DBMS_SQL得到比由Peter郎描述的引用游标方法甚至更大的灵活性。但这意味着更多的工作。

创建临时表的要求通常不被认为是很好的做法在Oracle中,在全局临时表是更好的,不会导致此问题

+0

我会记住这一点,但时间很短。下次吧。 – Tom 2009-12-22 00:41:08

+1

+1全局临时表比动态创建/销毁表好得多。动态创建表格更容易出错并且难以维护。 – 2011-05-03 08:04:35