دیتابیس اوراکل

دیتابیس اوراکل
طبقه بندی موضوعی

۲ مطلب در آبان ۱۴۰۲ ثبت شده است

Improve Bulk Insert with Array Processing

DECLARE
    CURSOR c_cur IS
      SELECT COL1, COL2, COL3, COL4
        FROM R2.TAB2 E
       WHERE E.ID = 5;

    TYPE c_array_t IS TABLE OF R1.TAB1%ROWTYPE; -- define collection for rows selected

    k_rows_max   CONSTANT INTEGER := 500; -- defines the maximum rows per fetch
    l_collect    c_array_t; -- define variable of rows collection
    
BEGIN
    OPEN c_cur;

    LOOP
        FETCH c_cur                  -- fetch up to LIMIT rows from cursor
        BULK COLLECT INTO l_collect LIMIT k_rows_max;

        FORALL i IN 1 .. l_collect.COUNT -- run insert for ALL rows in the collection
            INSERT INTO R1.TAB1
                 VALUES (l_collect (i).COL1,
                         l_collect (i).COL2,
                         l_collect (i).COl3,
                         l_collect (i).COL4);

        EXIT WHEN c_cur%NOTFOUND;                  -- no more rows so exit
        
    END LOOP;

    CLOSE c_cur;

    COMMIT;                                                  -- JUST 1 COMMIT;
    
END;

Improve Bulk Update with Array Processing

DECLARE
    CURSOR c_dim_cur IS
        SELECT /*+ parallel(10) */  
               k.col1, t.ID, t.col4
          FROM r1.tab1 t, r1.tab2 k
         WHERE t.no = k.no
           AND t.insert_sysdate < TRUNC (SYSDATE)
           AND t.col2 = '123456789'
           AND t.no IS NOT NULL;

    TYPE c_dim_array_t_1 IS RECORD
    (
        col1    r1.tab1.col2%TYPE,
        id      r1.tab1.ID%TYPE,
        col4    r1.tab1.col4%TYPE
    );

    TYPE c_dim_array_t IS TABLE OF c_dim_array_t_1; -- define collection for rows selected

    k_dim_rows_max   CONSTANT INTEGER := 5000; -- defines the maximum rows per fetch
    l_dim_collect             c_dim_array_t; -- define variable of rows collection
    
BEGIN
    OPEN c_dim_cur;
    LOOP
        FETCH c_dim_cur                  -- fetch up to LIMIT rows from cursor
        BULK COLLECT INTO l_dim_collect LIMIT k_dim_rows_max;

        FORALL i IN 1 .. l_dim_collect.COUNT -- run update for ALL rows in the collection
            UPDATE /*+ index(tab1 PK_tab1IX) parallel(10) */
                   r1.tab1 f
               SET f.col2 = l_dim_collect (i).col1
             WHERE f.id = l_dim_collect (i).id
               AND f.col4 = l_dim_collect (i).col4;

        EXIT WHEN c_dim_cur%NOTFOUND;                  -- no more rows so exit

        COMMIT;
        
    END LOOP;

    CLOSE c_dim_cur;

    COMMIT;
END;