2009-12-21 20 views
7

Quiero declarar un cursor en una tabla que no existe. Por supuesto, mi procedimiento no compila.Oracle PLSQL: declare un cursor en una tabla no existente

Esta tabla es una tabla temporal y se crea mediante un proceso previo. Existirá en tiempo de ejecución, pero en tiempo de compilación es otra historia.

Por mi selecto/actualiza y otras operatorias DML, he utilizado

EXECUTE IMMEDIATE 'operation from tmp_table'

pero no puedo encontrar una solución para los cursores.

¿Hay alguna manera?

Básicamente, quiero esto para compilar

drop table test; 

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

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

actualización

Hasta el momento no compilar:

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 

En caso de utilizar CREATE PROCEDURE, gracias.

Gracias de antemano.

+0

Usted consigue la excepción, ya que en realidad se ejecuta el código. Reemplace su 'declare' por un' CREATE PROCEDURE test_cursor AS' para compilar el código. –

+0

: facepalm 15cccc – Tom

+0

TOAD no tiene botón de compilación. : S Esto debería ser trivial! – Tom

Respuesta

7

Usted debe ser capaz de definir el cursor de esta manera:

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

También puede enlazar argumentos:

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

Para más información, véase la documentación de Oracle de la OPEN-FOR Statement.

Ejemplo usando un procedimiento almacenado

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

Gracias, pero dual es una tabla existente. Necesito hacer eso para un no existe tabla en tiempo de ejecución. – Tom

+0

error allí, es hora de compilación. – Tom

+0

No estoy seguro de lo que quiere decir. También puede cambiar la fuente proporcionada por 'SELECCIONAR * FROM some_not_existing_table'. Se compilará bien y se interrumpirá en tiempo de ejecución si la tabla todavía no existe. –

3

Usted puede utilizar DBMS_SQL para obtener aún más flexibilidad que el método del cursor ref descrito por Peter Lang. Pero también significa más trabajo.

5

Creación de tablas temporales como se requiere por lo general no se considera una buena práctica en Oracle, donde las tablas temporales globales son mejores y no causar este problema

+0

Lo tendré en cuenta, pero el tiempo es corto. Quizás la próxima vez. – Tom

+1

+1 Las tablas temporales globales son mucho mejores que crear/destruir tablas sobre la marcha. Crear tablas sobre la marcha es mucho más propenso a errores y más difícil de mantener. –

Cuestiones relacionadas