2011-12-09 53 views
6

Tôi không quen thuộc với PLSQL, tuy nhiên tôi phải thực hiện một số lượng lớn chèn cho một nhiệm vụ.oracle số lượng lớn chèn

Về cơ bản, tôi phải truy vấn bảng một để có được một cột và sau đó sử dụng nó trên một bảng khác để chèn nó. Một cái gì đó như thế này:

for (ids in a file As cur_id) 
{ 
Select DISTINCT column1 As col1_list from table1 where id=cur_id 

for (cols in col1_list as cur_col) 
    Insert into table2 values ('cur_id','cur_col','214','234','first 3 chars of cur_col') 
} 

Bây giờ, tôi có khoảng 4k id + trong file và mỗi id sẽ có phạm vi khác nhau của col1 riêng biệt: Max: 165 triệu, min ~ 2k

Tôi cố gắng để đạt được điều này "đọc từ một bảng và chèn vào sử dụng số lượng lớn chèn khác", nó không quan trọng nếu điều này chạy qua đêm, vv

tôi có kịch bản này từ một số nghiên cứu trực tuyến:

CREATE OR REPLACE PROCEDURE test_proc 
IS 
TYPE TObjectTable IS TABLE OF ALL_OBJECTS%ROWTYPE; 
ObjectTable$ TObjectTable; 

BEGIN 
    SELECT * BULK COLLECT INTO ObjectTable$ 
    FROM ALL_OBJECTS; 

    FORALL x in ObjectTable$.First..ObjectTable$.Last 
    INSERT INTO t1 VALUES ObjectTable$(x) ; 
END; 

tôi nghĩ rằng điều này có thể hữu ích trong trường hợp của tôi, nhưng tôi hoàn toàn không hiểu ngữ nghĩa. Nơi nào tôi đề cập đến column1 ... cũng cho các giá trị chèn được thể hiện như ObjectTable $ (x) insetead của các giá trị (.., .., ..).

Ai đó có thể giải thích kịch bản cho tôi và giúp tôi sửa đổi kịch bản cho trường hợp sử dụng của tôi bằng cách sử dụng các biến table1, table2, col1, ids etc mà tôi đã đề cập trong ví dụ của mình.

DB là 10g

Cảm ơn!

+0

Whats "loạt các col1 riêng biệt: Max: 165 triệu, min ~ 2k" phải nghĩa là? Vui lòng mô tả tốt hơn các cột của bảng 1 và bảng 2. – Codo

Trả lời

5

Bạn không cần thu thập số lượng lớn. Heck, bạn thậm chí không cần PL/SQL - SQL cũng có thể chèn số lượng lớn!

chỉ cần tạo một cái nhìn phù hợp với ROWTYPE% của bảng mục tiêu của bạn

create view v_Table1_Table2 as 
(select id, 
      max(case when /* condition for column1 */ 
        then /* expression for column1 */ 
        else null; 
       end) as column1, 
      max(case when /* condition for column2 */ 
        then /* expression for column2 */ 
        else null; 
       end) as column2, 
      max(case when /* condition for column3 */ 
        then /* expression for column3 */ 
        else null; 
       end) as column3 
    from  table1 
    group by id 
) 

sau đó

insert into table2 (select * from v_Table1_Table2 where id = :cur_id); 
Các vấn đề liên quan