oracle 定時任務刪除資料
阿新 • • 發佈:2022-12-07
這幾天在工作中遇到一個問題就是:要刪除表在備份表中已存在的資料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 定時任務相關操作