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

Java 是否可以使用parallel删除多个delete语句?delete语句是影响不同表的独立查询,java,stored-procedures,plsql,oracle11g,dbms-scheduler,Java,Stored Procedures,Plsql,Oracle11g,Dbms Scheduler,我有以下程序,用于在特定日期后将数据从事务表中删除到审计TBLE。这将作为批处理过程每晚运行: 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 VAR

我有以下程序,用于在特定日期后将数据从事务表中删除到审计TBLE。这将作为批处理过程每晚运行:

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;
是否可以并行运行所有删除操作

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

对。您需要使用DBMS\u调度程序将它们作为单独的作业进行调度

比如说,

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;
/
您只需要调整作业操作和重复间隔


有关更多示例,请参见此部分。

DBMS调度程序将不使用此过程。它将由JAVA SPRING调度程序调用。@Krishnendu您不必从应用程序端执行任何操作。DBMS_调度程序将驻留在数据库端。谢谢。。不客气。请将其标记为已回答,这可能也有助于其他人。