1. 程式人生 > 其它 >oracle 定時任務刪除資料

oracle 定時任務刪除資料

這幾天在工作中遇到一個問題就是:要刪除表在備份表中已存在的資料2000多萬資料,這個資料是SQL查出來的,例如:

select count(1)
from JY_SALE_FULLORDER_DTL
where LINE_NUM in (
    select b.LINE_NUM
    from JY_SALE_FULLORDER_DTL a  join JY_SALE_FULLORDER_DTL_HIS B ON       A.LINE_NUM = B.LINE_NUM
);

刪除SQL:

DELETE FROM JY_SALE_FULLORDER_DTL
WHERE LINE_NUM IN (
    SELECT b.LINE_NUM
    FROM JY_SALE_FULLORDER_DTL a
    JOIN JY_SALE_FULLORDER_DTL_HIS B ON A.LINE_NUM = B.LINE_NUM
)

之前用 DBvaver 建立任務,每次刪除或者更新10萬條資料,結果導致表被鎖死了

現在不能再用這個方法來刪資料了,因為刪除資料的時候不會停頓,我需要的是每一分鐘刪除2萬條資料,這樣的話,就不會讓表被鎖死了

在網上搜索到 oracle有自帶的定時任務 user_jobs, 後面慢慢研究了一下
參考部落格:oracle建立定時任務

SELECT * FROM USER_JOBS;

通過這個user_jobs知道,我要先建立一個儲存過程,這個儲存過程幹什麼事情呢,就是刪除我要刪除的資料

CREATE OR REPLACE PROCEDURE 儲存過程名字 AS
BEGIN
BEGIN
		 DELETE
		 FROM
			JY_SALE_FULLORDER_DTL
		 WHERE
			LINE_NUM IN (
			SELECT
				b.LINE_NUM
			FROM
				JY_SALE_FULLORDER_DTL a
			JOIN JY_SALE_FULLORDER_DTL_HIS B ON
				A.LINE_NUM = B.LINE_NUM)
			AND ROWNUM < 20000;
COMMIT ;
END;
END;

上面SQL可以看出,這是建立一個儲存過程,刪除表資料,但是每次刪除,查詢20000條資料出來刪除。

儲存過程建立好了,接下來我建立一條user_jobs資料

declare
  xjobid number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => xjobid,  /*自動生成JOB_ID*/  
        WHAT => 'declare BEGIN test_function(); END;',  /*需要執行的儲存過程名稱或SQL語句*/  
        NEXT_DATE => sysdate+3/(24*60),  /*初次執行時間-當前時間的3分鐘後*/  
        INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分鐘執行一次*/
      );
  commit;
end;

直接執行,然後user_jobs表就能生成一條資料

接下來,啟動定時任務

-- 執行定時任務
begin
  -- 這個job_id是自動生成的
  dbms_job.run(81);
end;

接下來只需要等著就行,電腦一直開著,如果oracle是線上遠端資料庫,電腦關機都可以,因為儲存過程和user_jobs不也都是在線上的嘛,建立完畢和開啟定時任務之後,跟本地電腦有沒有網沒關係。

如果覺得有點慢,你可以30秒刪除2萬條,或者一分鐘刪除5萬條等。可以自己修改間隔時間

begin
	dbms_job.interval(126,interval => 'sysdate+1/(24*60)');
end;

還有其他,暫停任務,刪除任務,間隔時間的表示式等具體請看
oracle 定時任務相關操作