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;
原文地址:https://www.cnblogs.com/monkey6/p/15329330.html