【问题标题】:How to bulk insert data from ref cursor to a temporary table in PL/SQL如何在 PL/SQL 中将数据从 ref 游标批量插入到临时表中
【发布时间】:2011-01-26 16:36:24
【问题描述】:

谁能告诉我如何将数据从引用游标批量插入到 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 中的代码?谢谢。

【问题讨论】:

    标签: sql sql-server oracle tsql plsql


    【解决方案1】:

    您可以对 REF CURSOR 使用 BULK 操作:

    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...INSERT 中看到太多改进。

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 没那么容易。我的代码只是一个示例。过程get_account_list 内部有很多计算,最后得出一个结果集,通过参数acc_list 传递给其他过程。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多