2010-03-12 10 views
6

Czy ktoś mógłby mi powiedzieć, jak wstawić dane masowe z kursora ref do tabeli tymczasowej w PL/SQL? Mam procedurę, że jeden z jej parametrów przechowuje zestaw wyników, ten zestaw wyników zostanie wstawiony do tabeli tymczasowej w innej procedurze przechowywanej.Jak wstawić dane zbiorcze z kursora ref do tabeli tymczasowej w PL/SQL

To jest mój przykładowy kod.

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; 

W SQL Server, można napisać kod jak poniżej

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 

Jak mogę napisać podobny do kodu w SQL Server? Dzięki.

Odpowiedz

6

można użyć operacji zbiorczych na REF kursora:

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 już implementuje ten optymalizacji dla zwykłej pętli choć, więc nie można zobaczyć wiele lepszy od prostego LOOP ... INSERT.

2

Jak o

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

To nie takie proste. Mój kod to tylko próbka. Procedura get_account_list ma wiele obliczeń w środku i ostatecznie pojawia się zestaw wyników, który jest przenoszony do innych procedur za pośrednictwem parametru acc_list. Dzięki. –

Powiązane problemy