2010-03-12 6 views
6

Quelqu'un pourrait-il me dire comment insérer en bloc des données d'un curseur ref dans une table temporaire en PL/SQL? J'ai une procédure que l'un de ses paramètres stocke un jeu de résultats, ce jeu de résultats sera inséré dans une table temporaire dans une autre procédure stockée.Comment insérer en bloc des données du curseur ref dans une table temporaire en PL/SQL

Ceci est mon exemple de code.

CREATE OR REPLACE PROCEDURE get_account_list 
(
type_id in account_type.account_type_id%type, 
acc_list out sys_refcursor 
) 
is 
begin 
    open acc_list for 
    select account_id, account_name, balance 
    from account 
    where account_type_id = type_id; 
end get_account_list; 

CREATE OR REPLACE PROCEDURE proc1 
(
    ... 
) 
is 
    accounts sys_refcursor; 
begin 
    get_account_list(1, accounts); 

    --How to bulk insert data in accounts to a temporary table? 


end proc1; 

Dans SQL Server, je peux écrire code ci-dessous

CREATE PROCEDURE get_account_list  
    type_id int 
as 
    select account_id, account_name, balance 
    from account 
    where account_type_id = type_id; 



CREATE PROCEDURE proc1 
(
    ... 
) 
as 
    ... 

    insert into #tmp_data(account_id, account_name, balance) 
    exec get_account_list 1 

Comment puis-je écrire similaire au code dans SQL Server? Merci.

Répondre

6

vous pouvez utiliser les opérations VRAC sur CURSEUR REF:

SQL> CREATE GLOBAL TEMPORARY TABLE gt (ID NUMBER); 

Table crÚÚe. 

SQL> DECLARE 
    2  l_refcursor SYS_REFCURSOR; 
    3  TYPE tab_number IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; 
    4  l_data tab_number; 
    5 BEGIN 
    6  OPEN l_refcursor FOR 
    7  SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 1e6; 
    8  LOOP 
    9  FETCH l_refcursor BULK COLLECT 
10   INTO l_data LIMIT 100; 
11 
12  FORALL i IN 1..l_data.count 
13   INSERT INTO gt VALUES (l_data(i)); 
14 
15  EXIT WHEN l_refcursor%NOTFOUND; 
16 
17  END LOOP; 
18  CLOSE l_refcursor; 
19 END; 
20/

ProcÚdure PL/SQL terminÚe avec succÞs. 

Oracle 10g implémente déjà cette optimisation pour la boucle régulière, donc vous ne pouvez pas voir beaucoup d'amélioration d'un simple BOUCLE ... INSÉRER.

2

Que diriez-vous

procedure insert_rec(in_type_id in number) is 
    begin 
    insert into temp_table 
    select account_id, account_name, balance 
    from account 
    where account_type_id = in_type_id; 
end insert_rec; 
+0

Ce n'est pas si simple. Mon code est juste un échantillon. La procédure get_account_list contient de nombreux calculs et finalement un ensemble de résultats qui est transféré à d'autres procédures via le paramètre acc_list. Merci. –

Questions connexes