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,谢谢。
在此先感谢。
你应该能够定义你的光标这样的:
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;
/
可以使用DBMS_SQL得到比由Peter郎描述的引用游标方法甚至更大的灵活性。但这意味着更多的工作。
创建临时表的要求通常不被认为是很好的做法在Oracle中,在全局临时表是更好的,不会导致此问题
我会记住这一点,但时间很短。下次吧。 – Tom 2009-12-22 00:41:08
+1全局临时表比动态创建/销毁表好得多。动态创建表格更容易出错并且难以维护。 – 2011-05-03 08:04:35
你得到的异常,因为你实际运行的代码。用'CREATE PROCEDURE test_cursor AS'替换'declare'来编译代码。 – 2009-12-21 20:01:19
:facepalm 15cccc – Tom 2009-12-21 20:04:05
TOAD没有编译按钮。 :S这应该是微不足道的! – Tom 2009-12-21 20:14:07