views:

459

answers:

3

Hi,

I want to declare a cursor on a table that does not exist. Of course, my procedure doesnt compile.

This table is a temporary table, and is created by a pre process. It will exist on runtime, but at compile time its another story.

For my select / updates an other DML operations, I've used

EXECUTE IMMEDIATE 'operation from tmp_table'

but I can't find a workaround for cursors.

Is there a way?

Basically, i want this to compile

drop table test;

/*from this on should compile*/
DECLARE
cursor c is select * from test;

BEGIN
  for reg in c LOOP
  /*...*/
  END LOOP;
END;

update

So far not compiling:

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

Should use CREATE PROCEDURE, thanks.

Thanks in advance.

+4  A: 

You should be able to define your cursor like this:

DECLARE
  c SYS_REFCURSOR;
BEGIN
  OPEN c FOR 'SELECT * FROM dual';
  CLOSE c;
END;

You can also bind arguments:

OPEN c FOR 'SELECT * FROM dual WHERE DUMMY = :1' USING 'X';


For further information see the Oracle documentation of the OPEN-FOR Statement.

Example using a stored procedure

CREATE OR REPLACE PROCEDURE test IS
  c SYS_REFCURSOR;
BEGIN
  OPEN c FOR 'SELECT * FROM fdfdfdfdfd';
  CLOSE c;
END;
/
Peter Lang
Thanks, but dual is an existing table. I need to do that for a not existing table at run time.
Tom
typo there, its compile time.
Tom
I'm not sure what you mean. You can also change the provided source by 'SELECT * FROM some_not_existing_table'. It will compile fine and break at runtime if the table still does not exist.
Peter Lang
I'm getting a 'table or view does not exist' in sqlplus
Tom
IMO it should work as expected. Tom, I think you are doing it wrong somehow.
ammoQ
@ammoQ I agree it compiles when using dual, but not when using an unexisting table. I added ann example to my question
Tom
A stored procedure does compile.CREATE OR REPLACE PROCEDURE test IS c SYS_REFCURSOR;BEGIN OPEN c FOR 'SELECT * FROM fdfdfdfdfd'; CLOSE c;END;/It will not execute, and a top-level anonymous block will fail when it tries to execute
Gary
@Gary, thanks for editing :)
Peter Lang
+2  A: 

You can use DBMS_SQL to get even more flexibility than the ref cursor method described by Peter Lang. But it means more work, too.

ammoQ
+1  A: 

Creating temporary tables as required is usually not considered good practice in Oracle, where Global Temporary Tables are better and would not cause this problem

David Aldridge
I'll keep that in mind, but time is short. Maybe next time.
Tom