2011-05-25 165 views
5

Soy nuevo en PL/SQL y acabo de llegar a los cursores en mi proceso de aprendizaje. He estado viendo parámetros de procedimientos almacenados con el tipo OUT SYS_REFCURSOR que, por lo que yo entiendo, su propósito es 'devolver datos' como un puntero en lenguaje C. Me pregunto quién va a cerrar ese parámetro SYS_REFCURSOR si el procedimiento tiene que abrirlo y no puede cerrarlo. (Si el procedimiento cierra el OUT SYS_REFCURSOR, no habrá ningún dato que devolver).¿Cómo cerrar un cursor de retorno en PL/SQL?

Además, creo que es un mal diseño confiar en funciones externas distintas del procedimiento almacenado que contiene el parámetro OUT SYS_REFCURSOR para cerrar el cursor. ¿Hay alguna forma de que pueda devolver una tabla desde un procedimiento almacenado sin usar cursores?

Respuesta

11

Todo lo que necesitará hacer es emitir una CLOSE en el cursor cuando haya terminado con él, independientemente de donde se llegue a abrirse:

-- A function to return a SYS_REFCURSOR 
CREATE OR REPLACE FUNCTION f_c RETURN SYS_REFCURSOR IS 
    cur SYS_REFCURSOR; 
BEGIN 
    OPEN cur FOR SELECT LEVEL FROM dual CONNECT BY LEVEL < 10; 
    RETURN cur; 
END; 

He aquí una muestra de ejecución:

DECLARE 
    cc SYS_REFCURSOR; 
    r VARCHAR2(10); 
BEGIN 
    cc := f_c;   -- Get the cursor from the function 
    LOOP 
    FETCH cc INTO r; 
    EXIT WHEN cc%NOTFOUND; 
    dbms_output.put_line('Output is: '||r); 
    END LOOP; 
    CLOSE cc;   -- Close the SYS_REFCURSOR returned from the function 
END; 
/

Output is: 1 
Output is: 2 
Output is: 3 
Output is: 4 
Output is: 5 
Output is: 6 
Output is: 7 
Output is: 8 
Output is: 9 

En cuanto a devolver un conjunto de valores de una función o procedimiento, aquí hay otro SO question sobre el tema.

Cuestiones relacionadas