2011-04-28 78 views
29

¿Cómo puedo recuperar desde un cursor de referencia que se devuelve desde un procedimiento almacenado (variable OUT) e imprimir las filas resultantes a STDOUT en SQL * PLUS?PL/SQL imprimir ref cursor devuelto por un procedimiento almacenado

ORACLE procedimiento almacenado:

PROCEDURE GetGrantListByPI(p_firstname IN VARCHAR2, p_lastname IN VARCHAR2, 
p_orderby IN VARCHAR2, p_cursor OUT grantcur); 

PL/SQL:

SET SERVEROUTPUT ON; 

DECLARE 
    TYPE r_cursor IS REF CURSOR; 
    refCursor r_cursor; 

    CURSOR grantCursor IS 
    SELECT last_name, first_name 
    FROM ten_year_pis 
    WHERE year_added = 2010; 

    last_name VARCHAR2(100); 
    first_name VARCHAR2(100); 

BEGIN 
    OPEN grantCursor; 
    FETCH grantCursor INTO last_name, first_name; 

    WHILE grantCursor%FOUND LOOP 
    PMAWEB_PKG.GetGrantListByPI(last_name, first_name, 'last_name', refCursor); 

    --HOW DO I LOOP THROUGH THE RETURNED REF CURSOR (refCursor) 
    --AND PRINT THE RESULTING ROWS TO STDOUT? 

    FETCH grantCursor into last_name, first_name; 
    END LOOP; 
    CLOSE grantCursor; 
END; 
/

Respuesta

35

Nota: Este código no se ha probado

definir un registro para su refcursor tipo de retorno, lo llaman rec. Por ejemplo:

TYPE MyRec IS RECORD (col1 VARCHAR2(10), col2 VARCHAR2(20), ...); --define the record 
rec MyRec;  -- instantiate the record 

vez que tenga el refcursor regresó de su procedimiento, se puede añadir el siguiente código donde sus comentarios son ahora:

LOOP 
    FETCH refCursor INTO rec; 
    EXIT WHEN refCursor%NOTFOUND; 
    dbms_output.put_line(rec.col1||','||rec.col2||','||...); 
END LOOP; 
+0

El problema es que el procedimiento almacenado devuelve un cursor ref como el resultado de una combinación entre dos tablas. ¿Cómo hago referencia a un tipo de devolución para una tabla de unión? – elpisu

+2

Necesita saber qué hay en el cursor en términos de tipos y tamaños para darle sentido. Defina un registro con los campos que están en su unión, y busque las filas en el registro. – DCookie

+0

gracias @DCookie, pero si tengo que leer solo una columna de cada fila, entonces lo que puedo hacer. ¿Necesito crear toda la estructura? –

17

Se puede utilizar una variable de vinculación a nivel SQLPlus a hacer esto. Por supuesto, tiene poco control sobre el formato de la salida.

VAR x REFCURSOR; 
EXEC GetGrantListByPI(args, :x); 
PRINT :x; 
2

Si desea imprimir todas las columnas de la cláusula select se puede ir con el comando de impresión automática.

CREATE OR REPLACE PROCEDURE sps_detail_dtest(v_refcur OUT sys_refcursor) 
AS 
BEGIN 
    OPEN v_refcur FOR 'select * from dummy_table'; 
END; 

SET autoprint on; 

--calling the procedure 
VAR vcur refcursor; 
DECLARE 
BEGIN 
    sps_detail_dtest(vrefcur=>:vcur); 
END; 

Hope esto le da una solución alternativa

Cuestiones relacionadas