2010-03-12 15 views
6

Có thể cho tôi biết cách chèn số lượng lớn dữ liệu từ con trỏ ref vào bảng tạm thời trong PL/SQL không? Tôi có một thủ tục rằng một trong các tham số của nó lưu trữ một tập kết quả, tập kết quả này sẽ được chèn vào một bảng tạm thời trong một thủ tục lưu sẵn khác.Làm thế nào để chèn số lượng lớn dữ liệu từ con trỏ ref vào bảng tạm thời trong PL/SQL

Đây là mã mẫu của tôi.

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; 

Trong SQL Server, tôi có thể viết dưới dạng mã dưới đây

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 

Làm thế nào tôi có thể viết tương tự như mã trong SQL Server? Cảm ơn.

Trả lời

6

bạn có thể sử dụng thao tác hàng loạt trên 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 đã thực hiện tối ưu hóa này cho vòng lặp thường xuyên mặc dù, vì vậy bạn có thể không thấy cải thiện nhiều từ đơn giản LOOP ... CHERTN.

2

Làm thế nào về

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

Nó không phải là dễ dàng. Mã của tôi chỉ là một mẫu. Các thủ tục get_account_list có nhiều tính toán bên trong và cuối cùng đi kèm với một tập kết quả được chuyển giao cho các thủ tục khác thông qua acc_list tham số. Cảm ơn. –

Các vấn đề liên quan