2010-03-12 7 views
6

Может ли кто-нибудь сказать мне, как навалом вставить данные из курсора ref во временную таблицу в PL/SQL? У меня есть процедура, в которой один из ее параметров хранит результирующий набор, этот результирующий набор будет вставлен во временную таблицу в другую хранимую процедуру.Как навалом вставить данные из курсора курсора во временную таблицу в PL/SQL

Это мой пример кода.

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; 

В SQL Server, я могу написать как код ниже

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 

Как я могу написать похож на код в SQL Server? Благодарю.

ответ

6

вы можете использовать операции BULK на REF CURSOR:

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 уже реализует эту оптимизацию для регулярного цикла, поэтому вы можете не увидеть много улучшений от простого LOOP ... ВСТАВИТЬ.

2

Как насчет

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

Это не так просто. Мой код - всего лишь образец. Процедура get_account_list имеет множество вычислений внутри и, наконец, появляется набор результатов, который передается другим процедурам через параметр acc_list. Благодарю. –

Смежные вопросы