【问题标题】:Is it possible to delete multiple delete statements using parallel ? The delete statements are separate queries affecting different tables是否可以使用并行删除多个删除语句?删除语句是影响不同表的单独查询
【发布时间】:2015-05-11 16:53:02
【问题描述】:

我有以下程序,该程序旨在在 certaibn 天后将数据从事务表删除到审计表。这将作为一个批处理过程每晚运行:

create or replace PROCEDURE PR_CONNECT_BATCH_MOVE2HIST(
    V_DB_RESPONSE OUT VARCHAR2,
    V_DB_DESCRIPTION OUT VARCHAR2 )
IS
  V_DAYS VARCHAR2(4000);
  V_CUR_DATE DATE:=SYSDATE;
  V_OPERATION_NAME VARCHAR2(1000);
  V_TABLE_NAME VARCHAR2(50);
  V_MESSAGE varchar2(4000);

BEGIN

V_OPERATION_NAME:='Fetching audit days value';
V_TABLE_NAME    :='CONNECT_DATA_CONFIG';

SELECT CONFIG_VALUE
INTO V_DAYS
FROM CONNECT_DATA_CONFIG
WHERE CONFIG_TYPE='Audit day count';

V_OPERATION_NAME:='DELETE FROM CONNECT_MASTER_CONTAINER';
V_TABLE_NAME    :='CONNECT_MASTER_CONTAINER';

DELETE
FROM CONNECT_MASTER_CONTAINER
WHERE V_CUR_DATE - NVL(UPDATED_DATE,CREATED_DATE) > TO_NUMBER(V_DAYS);

V_OPERATION_NAME:='DELETE FROM CONNECT_CONTAINER_TRANS';
V_TABLE_NAME    :='CONNECT_CONTAINER_TRANS';

DELETE
FROM CONNECT_CONTAINER_TRANS
WHERE V_CUR_DATE - NVL(UPDATED_DATE,CREATED_DATE) > TO_NUMBER(V_DAYS);

V_OPERATION_NAME:='DELETE FROM CONNECT_PARCEL_AGG';
V_TABLE_NAME    :='CONNECT_PARCEL_AGG';

DELETE
FROM CONNECT_PARCEL_AGG A
WHERE A.GENERATED_NUMBER IN
  (SELECT B.GENERATED_NUMBER
  FROM CONNECT_DELIVERY_TRANS B
  WHERE V_CUR_DATE - B.DB_CREATED_DATE > TO_NUMBER(V_DAYS)
  );

V_OPERATION_NAME:='DELETE FROM CONNECT_DELIVER_TRANS';
V_TABLE_NAME    :='CONNECT_DELIVER_TRANS';

DELETE FROM CONNECT_DELIVERY_TRANS B
  WHERE V_CUR_DATE - B.DB_CREATED_DATE > TO_NUMBER(V_DAYS);

EXECUTE IMMEDIATE ('TRUNCATE TABLE CONNECT_MOVE_ORDER_TEMP');

V_OPERATION_NAME:='FETCHING COMEPLETE ORDER/PARCEL DETAILS';
V_TABLE_NAME    :='CONNECT_MOVE_ORDER_TEMP';

INSERT INTO CONNECT_MOVE_ORDER_TEMP (ORDER_NUMBER,CLIENT_ID,PARCEL_NUMBER)
SELECT ORDER_NUMBER,CLIENT_ID,PARCEL_NUMBER FROM (
SELECT C.ORDER_NUMBER,C.CLIENT_ID, C.PARCEL_NUMBER,MIN(CHECK_FLAG) OVER( PARTITION BY C.ORDER_NUMBER,C.CLIENT_ID) AS MIN_VAL,
C.CHECK_DATE
FROM (
SELECT A.ORDER_NUMBER,A.CLIENT_ID, A.PARCEL_NUMBER,
CASE WHEN B.STATUS_NAME ='Collected' THEN 1
 WHEN TEMPA.SHIP_CONFIRM_FLAG ='Y' THEN 1
 ELSE 0 
 END AS CHECK_FLAG,
 TEMPA.CHECK_DATE
FROM CONNECT_PARCEL_STATE A,
(SELECT A.PARCEL_NUMBER,A.STATUS_ID,A.SHIP_CONFIRM_FLAG,NVL (A.UPDATED_DATE,A.CREATED_DATE) AS CHECK_DATE
FROM CONNECT_PARCEL_LATEST_TRANS A 
UNION ALL
SELECT B.PARCEL_NUMBER,B.OLD_STATUS_ID,B.SHIP_CONFIRM_FLAG,NVL(B.UPDATED_DATE,B.CREATED_DATE) AS CHECK_DATE
FROM CONNECT_PARCEL_RETURN_MAP B) TEMPA,CONNECT_STATUS_MASTER B
WHERE TEMPA.PARCEL_NUMBER=A.PARCEL_NUMBER
AND TEMPA.STATUS_ID=B.STATUS_ID ) C ) WHERE MIN_VAL=1 AND V_CUR_DATE - CHECK_DATE > TO_NUMBER(V_DAYS);

V_OPERATION_NAME:='DELETE FROM CONNECT_PARCEL_SERVICE_TRANS';
V_TABLE_NAME    :='CONNECT_PARCEL_SERVICE_TRANS';

DELETE FROM CONNECT_PARCEL_SERVICE_TRANS 
WHERE PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_PARCEL_RETURN_MAP';
V_TABLE_NAME    :='CONNECT_PARCEL_RETURN_MAP';

DELETE FROM CONNECT_PARCEL_RETURN_MAP 
WHERE  PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_PARCEL_LATEST_TRANS';
V_TABLE_NAME    :='CONNECT_PARCEL_LATEST_TRANS';

DELETE FROM CONNECT_PARCEL_LATEST_TRANS 
WHERE PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_LOC_PKG_TRANS';
V_TABLE_NAME    :='CONNECT_LOC_PKG_TRANS';

DELETE FROM CONNECT_LOC_PKG_TRANS 
WHERE PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_PARCEL_COLLECT';
V_TABLE_NAME    :='CONNECT_PARCEL_COLLECT';

DELETE FROM CONNECT_PARCEL_COLLECT
WHERE PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_TASK_DETAILS FOR CREATED TASKS';
V_TABLE_NAME    :='CONNECT_TASK_DETAILS';

DELETE FROM CONNECT_TASK_DETAILS
WHERE (TASK_DETAILS,CLIENT_ID) IN (
SELECT DISTINCT ORDER_NUMBER,CLIENT_ID FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_TASK_DETAILS FOR REQUIRED ASSISTANCE';
V_TABLE_NAME    :='CONNECT_TASK_DETAILS';

DELETE FROM CONNECT_TASK_DETAILS
WHERE TASK_DETAILS IS NULL AND CLIENT_ID IS NULL 
AND V_CUR_DATE - NVL(TASK_UPDATE_DATE,TASK_CREATE_DATE) > TO_NUMBER(V_DAYS);

V_OPERATION_NAME:='DELETE FROM CONNECT_TASK_DETAILS';
V_TABLE_NAME    :='CONNECT_PARCEL_STATE';

DELETE FROM CONNECT_PARCEL_STATE
WHERE PARCEL_NUMBER IN (
SELECT PARCEL_NUMBER FROM CONNECT_MOVE_ORDER_TEMP);

V_OPERATION_NAME:='DELETE FROM CONNECT_CUSTOMER_TRANS';
V_TABLE_NAME    :='CONNECT_CUSTOMER_TRANS';

DELETE FROM CONNECT_CUSTOMER_TRANS
WHERE (ORDER_NUMBER,CLIENT_ID) IN (
SELECT DISTINCT ORDER_NUMBER,CLIENT_ID FROM CONNECT_MOVE_ORDER_TEMP);

COMMIT;

V_DB_RESPONSE:='000';
V_DB_DESCRIPTION:='Batch Process Complete';

EXCEPTION

  WHEN OTHERS THEN                
  V_DB_RESPONSE:='500';
  V_MESSAGE :=  SQLCODE ||':'|| SQLERRM;
  V_DB_DESCRIPTION:='Internal DB error';

INSERT INTO CONNECT_LOG
  (
    PROCEDURE_NAME,
    TABLE_NAME,
    OPERATION_NAME,
    MESSAGE,
    OPERATION_DATE,
    RESPONSE_CODE
  )
  VALUES
  (
    'PR_CONNECT_BATCH_MOVE2HIST',
    V_TABLE_NAME,
    V_OPERATION_NAME,
    V_MESSAGE,
    SYSDATE,
    V_DB_RESPONSE
  ); 

COMMIT;

END PR_CONNECT_BATCH_MOVE2HIST;

是否可以并行运行所有删除操作??

【问题讨论】:

    标签: java stored-procedures plsql oracle11g dbms-scheduler


    【解决方案1】:

    是否可以并行运行所有删除操作?

    是的。您需要使用 DBMS_SCHEDULER 将它们安排为单独的作业。

    例如,

    BEGIN
      -- Job defined entirely by the CREATE JOB procedure.
      DBMS_SCHEDULER.create_job (
        job_name        => 'job_name',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN DELETE FROM table WHERE...; END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'freq=hourly; byminute=0',
        end_date        => NULL,
        enabled         => TRUE,
        comments        => 'Job defined entirely by the CREATE JOB procedure.');
    END;
    /
    

    您只需要调整作业操作和repeat_interval。

    有关更多示例,请参阅此link

    【讨论】:

    • DBMS 调度程序不会使用该过程。它将被 JAVA SPRING 调度程序调用。
    • @Krishnendu 您不必从应用程序端做任何事情。 DBMS_SCHEDULER 将驻留在数据库端。
    • 谢谢 .. 它已实现:)
    • 不客气。请将其标记为已回答,它也可能对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2013-07-06
    • 2021-02-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多