How do I use bulk collect and insert in Pl/SQl

前端 未结 3 1570
难免孤独
难免孤独 2020-12-19 19:09

I want to fetch around 6 millions rows from one table and insert them all into another table. How do I do it using BULK COLLECT and FORALL ?

3条回答
  •  难免孤独
    2020-12-19 19:47

    The SQL engine parse and executes the SQL Statements but in some cases ,returns data to the PL/SQL engine.

    During execution a PL/SQL statement, every SQL statement cause a context switch between the two engine. When the PL/SQL engine find the SQL statement, it stop and pass the control to SQL engine. The SQL engine execute the statement and returns back to the data in to PL/SQL engine. This transfer of control is call Context switch. Generally switching is very fast between PL/SQL engine but the context switch performed large no of time hurt performance . SQL engine retrieves all the rows and load them into the collection and switch back to PL/SQL engine. Using bulk collect multiple row can be fetched with single context switch.

    Example : 1

    DECLARE
    
    Type stcode_Tab IS TABLE OF demo_bulk_collect.storycode%TYPE;
    Type category_Tab IS TABLE OF demo_bulk_collect.category%TYPE;
    s_code stcode_Tab;
    cat_tab category_Tab;
    Start_Time NUMBER;
    End_Time NUMBER;
    
    CURSOR c1 IS 
    select storycode,category from DEMO_BULK_COLLECT;
    BEGIN
       Start_Time:= DBMS_UTILITY.GET_TIME;
       FOR rec in c1
       LOOP
         NULL;
         --insert into bulk_collect_a values(rec.storycode,rec.category);
       END LOOP;
        End_Time:= DBMS_UTILITY.GET_TIME;
        DBMS_OUTPUT.PUT_LINE('Time for Standard Fetch  :-' ||(End_Time-Start_Time) ||'  Sec');
    
        Start_Time:= DBMS_UTILITY.GET_TIME;    
        Open c1;
            FETCH c1 BULK COLLECT INTO s_code,cat_tab;
        Close c1;
     FOR x in s_code.FIRST..s_code.LAST
     LOOP
     null;        
     END LOOP;
    End_Time:= DBMS_UTILITY.GET_TIME; 
    DBMS_OUTPUT.PUT_LINE('Using Bulk collect fetch time :-' ||(End_Time-Start_Time) ||'  Sec');
    END;
    

提交回复
热议问题