2010-11-03 15 views
5

Tengo un procedimiento almacenado que ejecuta otro procedimiento almacenado varias veces. Necesito una unión y devolver datos, que tengo después de ejecutar el segundo procedimiento.Datos de unión de cursores en uno

¿Puedo de alguna manera unir datos de varios cursores en un cursor uno al otro? Es posible sin tablas temporales o tipo de datos tipo tabla?

EDITAR: Cursor count for union en realidad es n (donde n es 1, 2, 3, etc., detectando por otro procedimiento).

Por ejemplo:

CREATE OR REPLACE PROCEDURE proc_data 
(data_out OUT SYS_REFCURSOR 
) IS 
BEGIN 
OPEN data_out FOR SELECT '1' NUM FROM dual; 
END; 
/

CREATE OR REPLACE PROCEDURE proc_result 
(data_out OUT SYS_REFCURSOR 
) IS 
data1 SYS_REFCURSOR; 
data2 SYS_REFCURSOR; 
BEGIN 
PROC_DATA(data1); 
PROC_DATA(data2); 
-- select data1 and data2 into data_out - how? 
END; 
/

SET SERVEROUTPUT ON 

DECLARE 
data_out SYS_REFCURSOR; 
temp_row VARCHAR2(10); 
BEGIN 
PROC_RESULT(data_out); 
    LOOP 
    FETCH data_out INTO temp_row; 
    EXIT WHEN data_out%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(temp_row); 
    END LOOP; 
    CLOSE data_out; 
END; 
/

salida esperada:

--- 
1 
1 

Respuesta

2

No, no es posible. Hay a nice discussion en AskTom con respecto a esta pregunta, eche un vistazo tal vez algunas soluciones siempre que puedan ayudarle.

3

Usted puede lograr esto mediante la creación de un pipelined function que permitirá hacer

select table(PROC_DATA(data1)) union table(PROC_DATA(data2)) 
+0

n es constante o variable? –

+0

n - variable. Este fue solo un ejemplo para explicar mi pregunta, en real db, el conteo de los cursores para la unión es detectado por otro procedimiento. – ksogor

+2

Luego podría compilar la tabla de selección (PROC_DATA (data1)) tabla de unión (PROC_DATA (data2)) tabla de unión (PROC_DATA (data3)) ... consultar dinámicamente y ejecutarlo –

Cuestiones relacionadas