resueltos - pl sql oracle
Oracle PLSQL: declare un cursor en una tabla no existente (3)
Deberías poder definir tu cursor así:
DECLARE
c SYS_REFCURSOR;
BEGIN
OPEN c FOR ''SELECT * FROM dual'';
CLOSE c;
END;
También puedes vincular argumentos:
OPEN c FOR ''SELECT * FROM dual WHERE DUMMY = :1'' USING ''X'';
Para obtener más información, consulte la documentación de Oracle de la declaración OPEN-FOR .
Ejemplo usando un procedimiento almacenado
CREATE OR REPLACE PROCEDURE test IS
c SYS_REFCURSOR;
BEGIN
OPEN c FOR ''SELECT * FROM fdfdfdfdfd'';
CLOSE c;
END;
/
Quiero declarar un cursor en una tabla que no existe. Por supuesto, mi procedimiento no compila.
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.
Para mis selecciones / actualizaciones y otras operaciones DML, he usado
EXECUTE IMMEDIATE ''operation from tmp_table''
pero no puedo encontrar una solución para los cursores.
¿Hay alguna manera?
Básicamente, quiero que esto 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;
actualizar
Hasta ahora no compilando:
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
Debería usar CREATE PROCEDURE, gracias.
Gracias por adelantado.
La creación de tablas temporales como se requiere generalmente no se considera una buena práctica en Oracle, donde las tablas temporales globales son mejores y no causarían este problema.
Puede usar DBMS_SQL para obtener incluso más flexibilidad que el método del cursor de referencia descrito por Peter Lang. Pero también significa más trabajo.