簡體   English   中英

Oracle PL / SQL-如何使用Oracle集合將大量數據從一個表復制到另一個表

[英]Oracle PL/SQL - How do i copy a large amount of data from one table to another using oracle collections

這是測試每個oracle集合(關聯數組,變量數組和嵌套表)的處理速度的一項工作,但是我不確定如何實現-我對PL / SQL和oracle來說還是相當陌生。

因此,我創建了兩個表-一個表包含三列,具有超過300萬條記錄,另一個表為空。 如何使用收集方法將數據從已填充的表復制到空表?

在此先感謝-如果我沒有提供足夠的信息,請原諒-我對此很陌生...

理查德

/* package header */
CREATE OR REPLACE PACKAGE perfrormance_test AS

    PROCEDURE nested_table;
    PROCEDURE associative_array;

END perfrormance_test;


/* package body */
CREATE OR REPLACE PACKAGE BODY perfrormance_test AS

    PROCEDURE nested_table
    AS
        /* select all records from source table */
        CURSOR big_table_cur IS
            SELECT  col1
            ,       col2
            ,       col3
            FROM    big_table;

        /* create nested table type and variable that will hold BIG_TABLE's records */
        TYPE big_table_ntt IS TABLE OF big_table_cur%ROWTYPE;
        l_big_table  big_table_ntt;
    BEGIN
        /* open pointer to SELECT statement */
        OPEN  big_table_cur;
        /* collect data in the collection */
        FETCH big_table_cur BULK COLLECT INTO l_big_table;
        /* close the pointer */
        CLOSE big_table_cur;

        /* print size of the collection */
        DBMS_OUTPUT.PUT_LINE('Nested table holds: ' || TO_CHAR(l_big_table.COUNT) || ' records.');

        /* write data down to target table */
        FORALL indx IN l_big_table.FIRST..l_big_table.LAST
            INSERT  INTO big_table_target(col1, col2, col3)
            VALUES  (l_big_table(indx).col1, l_big_table(indx).col2, l_big_table(indx).col3);
        /*
        **  or you can use it this way:
        **
        **  VALUES  (l_big_table(indx));
        */

        /* print number of rows inserted */
        DBMS_OUTPUT.PUT_LINE('Number of rows inserted ' || SQL%ROWCOUNT || ' rows');

        /* save changes */
        COMMIT;

        /* or if you want undo changes  */
        /* ROLLBACK; */
    END nested_table;

    PROCEDURE associative_array
    AS
        /* create record (row) type */
        TYPE strings_rec IS RECORD
        (
            one   VARCHAR2(4000)
        ,   two   VARCHAR2(4000)
        ,   three VARCHAR2(4000)
        );

        /* create collection of records: type and variable */
        TYPE strings_aat IS TABLE OF strings_rec INDEX BY VARCHAR2(4000);
        l_strings  strings_aat;
    BEGIN
        /* populate collection with 3 000 000 rows */
        /* looping can take some time */
        FOR indx IN 1..3000000 LOOP
            l_strings('indx_' || TO_CHAR(indx)).one   := 'column one   indx ' || TO_CHAR(indx);
            l_strings('indx_' || TO_CHAR(indx)).two   := 'column two   indx ' || TO_CHAR(indx);
            l_strings('indx_' || TO_CHAR(indx)).three := 'column three indx ' || TO_CHAR(indx);
        END LOOP;

        /* print size of the collection */
        DBMS_OUTPUT.PUT_LINE('Assoc table holds: ' || TO_CHAR(l_strings.COUNT) || ' records.');

        /*
        ** CREATE TABLE aat_target
        ** (
        **     t_id  VARCHAR(4000)
        ** ,   one   VARCHAR(4000)
        ** ,   two   VARCHAR(4000)
        ** ,   three VARCHAR(4000)
        ** );
        */

        /* insert rows */
        FORALL indx IN l_strings.FIRST..l_strings.LAST
            INSERT  INTO aat_target(t_id, one, two, three)
            VALUES  (l_strings(indx), l_strings(indx).one, l_strings(indx).two, l_strings(indx).three);

        /* print number of rows inserted */
        DBMS_OUTPUT.PUT_LINE('Number of rows inserted ' || SQL%ROWCOUNT || ' rows');

        COMMIT;
    END associative_array;

END perfrormance_test;

從命令行運行SQL * PLUS:

sqlplus user/pass@db_name

類型:

SQL> SET SERVEROUTPUT ON
SQL> SET TIMING ON
SQL> BEGIN
2    perfrormance_test.nested_table;
3    END;
-- exec time will be displayed here

SQL> BEGIN
2    perfrormance_test.associative_array;
3    END;
-- exec time will be displayed here

它未經測試,因此您必須糾正小的錯別字。

我不使用VARRAY。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM