2012-03-14 41 views
5

Tôi muốn chèn vào các bảng khác nhau với chỉ vòng lặp FORALL duy nhất trong oracle.but FORALL không hỗ trợ it.any ý tưởng làm thế nào tôi có thể làm điều đó ??Nhiều câu lệnh SQL trong vòng lặp FORALL

create or replace PROCEDURE test IS 
     TYPE avl_web_details IS TABLE OF available_web_details%ROWTYPE; 
     var_avl_web_details avl_web_details := avl_web_details(); 
     UNIONTABLE VARCHAR2(30000); 
     TYPE RepCurTyp IS REF CURSOR; 
     Rep_cv RepCurTyp; 
    BEGIN 
     UNIONTABLE := ''; 
    execute immediate 'update tbl_used_webuda1 set flag=1'; 
    FOR tbl IN (SELECT tablename FROM tbl_used_webuda1 where flag=1) 
     LOOP    
    UNIONTABLE := UNIONTABLE || 'select *' || ' from ' || tbl.tablename || 'union all ';  
END LOOP; 

     IF (LENGTH(UNIONTABLE) > 10) THEN 
     UNIONTABLE := '(' || SUBSTR(UNIONTABLE,1, length(UNIONTABLE)-10) || ') ';    
    end if; 
     OPEN Rep_cv FOR 'select from_unixtime("5mintime") as "5mintime",username,host,src_zone,domain,dst_zone,content,category,url,hits ,bytes,appid ,application,categorytype,usergroup from'|| uniontable; 
LOOP 
    FETCH Rep_cv BULK COLLECT INTO var_avl_web_details LIMIT 200000; 
     FORALL i IN 1..var_avl_web_details.COUNT 
      insert into available_web_details values var_avl_web_details(i); 
    insert into web_ap_ca_co_do_ur_us_5min values(ts ,var_avl_web_details(i).application ,var_avl_web_details(i).category ,var_avl_web_details(i).content ,var_avl_web_details(i).domain ,var_avl_web_details(i).dst_zone ,var_avl_web_details(i).url ,var_avl_web_details(i).username ,var_avl_web_details(i).hits,var_avl_web_details(i).bytes,var_avl_web_details(i).appid);  
    insert into web_user_5min values(ts,var_avl_web_details(i).username,var_avl_web_details(i).hits,var_avl_web_details(i).bytes,var_avl_web_details(i).appid); 
    EXIT WHEN Rep_cv%NOTFOUND; 
end loop; 
close rep_cv; 
end;** 

Trả lời

10

FORALL không phải là "lệnh vòng lặp", nó là một phần của cú pháp cho lệnh chèn hàng loạt. Vì vậy, giải pháp đúng là viết mệnh đề FORALL với mỗi chèn:

FORALL i IN 1..var_avl_web_details.COUNT 
    insert into available_web_details values var_avl_web_details(i); 

FORALL i IN 1..var_avl_web_details.COUNT 
    insert into web_ap_ca_co_do_ur_us_5min values(ts ,var_avl_web_details(i).application ,var_avl_web_details(i).category ,var_avl_web_details(i).content ,var_avl_web_details(i).domain ,var_avl_web_details(i).dst_zone ,var_avl_web_details(i).url ,var_avl_web_details(i).username ,var_avl_web_details(i).hits,var_avl_web_details(i).bytes,var_avl_web_details(i).appid);  

FORALL i IN 1..var_avl_web_details.COUNT 
    insert into web_user_5min values(ts,var_avl_web_details(i).username,var_avl_web_details(i).hits,var_avl_web_details(i).bytes,var_avl_web_details(i).appid); 
+0

Thậm chí tôi không thể gọi thủ tục bên trong vòng lặp FORALL .. ?? –

+3

Đó là ** không ** một "vòng lặp"! Không, bạn chỉ có thể sử dụng FORALL với các câu lệnh DML. –

2

Không cần gọi FORALL nhiều lần. Chỉ cần sử dụng câu lệnh INSERT ALL DML.


forall i in v_list.first..v_list.last 
    insert all 
    into t116 (id) values (v_list(i)) 
    into t117 (id) values (v_list(i)) 
     select 1 from dual; 
Các vấn đề liên quan