Можно ли удалить несколько операторов удаления, используя параллель? Операторы удаления - это отдельные запросы, влияющие на разные таблицы.
У меня есть следующий процесс, который предназначен для удаления данных из таблицы транзакций в контрольные таблицы по истечении определенных дней. Это будет выполняться каждую ночь как пакетный процесс:
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;
Возможно ли запустить все удаления параллельно??
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.
Смотрите эту ссылку для большего количества примеров.