2010-03-12 46 views
6

¿Podría alguien decirme cómo insertar datos a granel desde un cursor de referencia a una tabla temporal en PL/SQL? Tengo un procedimiento en el que uno de sus parámetros almacena un conjunto de resultados, este conjunto de resultados se insertará en una tabla temporal en otro procedimiento almacenado.Cómo insertar datos a granel desde el cursor de ref a una tabla temporal en PL/SQL

Este es mi código de muestra.

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; 

En SQL Server, puedo escribir como código de abajo

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 

¿Cómo puedo escribir similar al código en SQL Server? Gracias.

Respuesta

6

puede utilizar las operaciones masivas de 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 ya implementa esta optimización de bucle normal aunque, por lo que no puede ver una gran mejora desde una simple LOOP ... INSERTAR.

2

¿Qué tal

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

No es tan fácil. Mi código es solo una muestra. El procedimiento get_account_list tiene muchos cálculos dentro y finalmente aparece un conjunto de resultados que se transfiere a otros procedimientos a través del parámetro acc_list. Gracias. –

Cuestiones relacionadas