2012-03-14 13 views
5

में एकाधिक एसक्यूएल स्टेटमेंट्स मैं ऑरैकल में केवल एकल फोरल लूप के साथ अलग-अलग तालिकाओं में सम्मिलित करना चाहता हूं। लेकिन इसके लिए समर्थन न करें। कोई विचार मैं इसे कैसे कर सकता हूं ??फोरल लूप

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;** 

उत्तर

10

FORALL एक "लूप कमांड" नहीं है, यह थोक सम्मिलन कथन के लिए वाक्यविन्यास का हिस्सा है। तो सही समाधान प्रत्येक डालने के साथ फोरल क्लॉज लिखना है:

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

यहां तक ​​कि मैं फोरल लूप के अंदर प्रक्रिया को कॉल करने में सक्षम नहीं हूं .. ?? –

+3

यह ** ** ** "लूप" नहीं है! नहीं, आप केवल डीएमएल कथन के साथ फोरल का उपयोग कर सकते हैं। –

2

कई बार कॉल करने की आवश्यकता नहीं है। बस INSERT सभी डीएमएल कथन का उपयोग करें।


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;