2010-11-03 17 views
5

J'ai une procédure stockée qui exécute une autre procédure stockée plusieurs fois. J'ai besoin d'union et de retour de données, ce que j'ai après l'exécution de la deuxième procédure.Les données de l'union des curseurs en un

Puis-je d'une certaine manière mettre les données d'union de plusieurs curseurs dans un autre curseur? C'est possible sans tables temporaires ou type de données de type table?

EDIT: Le nombre de curseurs pour l'union est réellement n (où n est 1, 2, 3, etc, détectant par une autre procédure).

Par exemple:

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; 
/

résultat attendu:

--- 
1 
1 

Répondre

2

Non, il est impossible. Il ya a nice discussion à AskTom à propos de cette question, jetez un oeil à quelques solutions de contournement à condition qu'il puisse vous aider.

3

Vous pouvez y parvenir en créant un pipelined function qui vous permettra de faire

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

n étant constant ou variable? –

+0

n - variable. Ce fut un exemple seulement pour expliquer ma question, dans le compte réel db curseurs pour l'union est la détection par une autre procédure. – ksogor

+2

Ensuite, vous pouvez construire dynamiquement la table de sélection de table (PROC_DATA (data1)) table de syndicats (PROC_DATA (data2)) (PROC_DATA (data3)) ... requête dynamiquement et l'exécuter –