zoukankan      html  css  js  c++  java
  • oracle批量处理范例

    Oracle批量处理范例

    PL SQL和SQL用的是不同的引擎来处理的,SQL使用SQL引擎,PLSQL使用PLSQL引擎。在PLSQL块,存储过程,函数中,PLSQL和SQL是共同存在的,变量,赋值,循环等用的是PLSQL引擎,但是游标中FETCH一条记录是通过SQL引擎的,因此循环的时候,PLSQL和SQL引擎会进行大量的上下文切换,减少切换可以提高效率。

    1.批量检索

    DECLARE
       CURSOR_EMP               SYS_REFCURSOR;
       V_SQL                    VARCHAR2 (4000);
    
       TYPE NAMELIST IS TABLE OF VARCHAR2 (20);
    
       V_ENAME                  NAMELIST;
       CN_FETCH_SIZE   CONSTANT PLS_INTEGER := 1000;
    BEGIN
       V_SQL := 'SELECT ENAME FROM SCOTT.EMP WHERE EMPNO > :1';
    
       OPEN CURSOR_EMP FOR V_SQL USING 7698;
    
       LOOP
          FETCH CURSOR_EMP
          BULK COLLECT INTO V_ENAME
          LIMIT CN_FETCH_SIZE;
    
          FOR I IN 1 .. V_ENAME.COUNT
          LOOP
             DBMS_OUTPUT.PUT_LINE (V_ENAME (I));
          END LOOP;
    
          EXIT WHEN V_ENAME.COUNT < CN_FETCH_SIZE;
       END LOOP;
    
       CLOSE CURSOR_EMP;
    END;
    

    2.批量处理

    2.1.批量检索,单条处理

    /* Formatted on 2021-09-24 上午 09:39:38 (QP5 v5.163.1008.3004) */
    DECLARE
       TYPE TYPE_RECORD_TEST02 IS RECORD
       (
          ID         MONKEY.TEST02.ID%TYPE,
          ADD_DATE   MONKEY.TEST02.ADD_DATE%TYPE,
          NAME       MONKEY.TEST02.NAME%TYPE,
          RID        UROWID
       );
    
       TYPE TYPE_RESULT IS VARRAY (1000) OF TYPE_RECORD_TEST02;
    
       RESULT                   TYPE_RESULT;
       CN_BATCH_SIZE   CONSTANT PLS_INTEGER := 1000;
       CUR_TEST02               SYS_REFCURSOR;
       V_SQL    VARCHAR2 (4000) := 'SELECT ID,ADD_DATE,NAME,ROWID FROM MONKEY.TEST02 WHERE ID >:1';
    BEGIN
       OPEN CUR_TEST02 FOR V_SQL USING 2;
    
       LOOP
          FETCH CUR_TEST02
          BULK COLLECT INTO RESULT
          LIMIT CN_BATCH_SIZE;
    
          FOR I IN 1 .. RESULT.COUNT
          LOOP
             UPDATE MONKEY.TEST02
                SET ADD_DATE = ADD_DATE + 1
              WHERE ROWID = RESULT (I).RID;
          END LOOP;
    
          EXIT WHEN RESULT.COUNT < CN_BATCH_SIZE;
       END LOOP;
    
       CLOSE CUR_TEST02;
    
       COMMIT;
    END;
    

    2.2.批量检索,批量处理

    /* Formatted on 2021-09-24 上午 09:56:49 (QP5 v5.163.1008.3004) */
    DECLARE
       TYPE TYPE_TEST02_ID_LIST IS TABLE OF MONKEY.TEST02.ID%TYPE;
    
       TYPE TYPE_TEST02_ADD_DATE_LIST IS TABLE OF MONKEY.TEST02.ADD_DATE%TYPE;
    
       TYPE TYPE_TEST02_NAME_LIST IS TABLE OF MONKEY.TEST02.NAME%TYPE;
    
       TYPE TYPE_TEST02_ROWID_LIST IS TABLE OF UROWID;
    
       ID_LIST                  TYPE_TEST02_ID_LIST;
       ADD_DATE_LIST            TYPE_TEST02_ADD_DATE_LIST;
       NAME_LIST                TYPE_TEST02_NAME_LIST;
       ROWID_LIST               TYPE_TEST02_ROWID_LIST;
       CN_BATCH_SIZE   CONSTANT PLS_INTEGER := 1000;
       CUR_TEST02               SYS_REFCURSOR;
       V_SQL   VARCHAR2 (4000) := 'SELECT ID,ADD_DATE,NAME,ROWID FROM MONKEY.TEST02 WHERE ID >:1';
    BEGIN
       OPEN CUR_TEST02 FOR V_SQL USING 2;
    
       LOOP
          FETCH CUR_TEST02
          BULK COLLECT INTO ID_LIST, ADD_DATE_LIST, NAME_LIST, ROWID_LIST
          LIMIT CN_BATCH_SIZE;
    
          FOR I IN 1 .. ROWID_LIST.COUNT
          LOOP
             ADD_DATE_LIST (I) := ADD_DATE_LIST (I) + 1;
          END LOOP;
    
          FORALL I IN 1 .. ROWID_LIST.COUNT
             EXECUTE IMMEDIATE
                'UPDATE MONKEY.TEST02 SET ADD_DATE=:1 WHERE ROWID=:2'
                USING ADD_DATE_LIST (I), ROWID_LIST (I);
    
          EXIT WHEN ROWID_LIST.COUNT < CN_BATCH_SIZE;
       END LOOP;
    
       CLOSE CUR_TEST02;
    
       COMMIT;
    END;
    
  • 相关阅读:
    Test1
    排序之快速排序
    java注解
    排序之插入排序
    java IO之输出流——OutputStream
    java IO之输入流——InputStream
    行为模式之中介者
    行为模式之命令
    行为模式之职责链
    结构型模式总结
  • 原文地址:https://www.cnblogs.com/monkey6/p/15329330.html
Copyright © 2011-2022 走看看