Как массовая вставка данных из курсора ref во временную таблицу в PL / SQL

может ли кто-нибудь сказать мне, как массово вставлять данные из курсора ref во временную таблицу в 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? Спасибо.

2 ответов


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


как о

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;