java - 是否可以使用 parallel 删除多个 delete 语句?删除语句是影响不同表的单独查询

标签 java stored-procedures plsql oracle11g dbms-scheduler

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

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;

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

最佳答案

Is it possible to run all the deletes in parallel ?

是的。您需要使用 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;
/

您只需要调整作业操作和重复间隔。

查看此 link更多示例。

关于java - 是否可以使用 parallel 删除多个 delete 语句?删除语句是影响不同表的单独查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28960544/

相关文章:

oracle - PL/SQL异常处理-函数返回无值

java - Facebook 分享图片 sharedialog

asp.net - 检索此数据的最佳方法是什么?

sql - 是否可以编写一个查询来返回两个指定日期之间的每一天的日期?

ORACLE PLSQL IF ELSEIF ELSE 不起作用

mysql - 使用 Execute 避免来自 SP 的 MySQL 多重结果

java - URL 和用户的 Spring Security 配置

java - 无法让 Admob 在多种布局上显示?

java - 在 CIDR 网络 block 中查找免费前缀

sql-server - 存储过程中的 SQL 默认架构解析