Oracle

更改 DBA_JOBS 的 WHAT 列

  • November 11, 2016

我正在使用作業來更新物化視圖。

我發現如果exec dbms_refresh.refresh(''"<schema>"."<materialized_view_name>"'');未送出作業,作業會自行鎖定,我想更改作業的“內容”列以包含送出。

我面臨兩種可能的解決方案:

解決方案1:更複雜的方法是完全重新創建作業,我想避免

跑步SYS.DBMS_JOB.REMOVE(14133); COMMIT;

重新創建整個作業以現在包含送出

DECLARE
 X NUMBER;
BEGIN
 SYS.DBMS_JOB.SUBMIT
 ( job       => X 
  ,what      => 'exec dbms_refresh.refresh(''"<schema>"."<materialized_view_name>"'');COMMIT;'
  ,next_date => to_date('11-11-2016 00:00:00','dd/mm/yyyy hh24:mi:ss')
  ,interval  => 'trunc(sysdate)+1   '
  ,no_parse  => FALSE
 );
 SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/

解決方案 2:通過在視圖上執行正常的更新語句直接更新 DBA_JOBS 視圖

update dba_jobs set what=(
select what from dba_jobs 
where job in ( '1','2','3','<etc>')
)||'COMMIT;'  
where job in ( '1','2','3','<etc>');

有沒有比這兩個更好的解決方案,解決方案兩個可能嗎?

我想避免使用解決方案 1,因為我暗示我手頭沒有視圖的程式碼,這將需要更多時間,另外讓我們暗示我有數百個需要修改。

真的嗎?DBMS_JOB有一個叫做CHANGE.

declare
 jobno number;
begin
 dbms_job.submit(jobno, 'begin null; end;');
end;
/
commit;

select job, what from user_jobs;

      JOB WHAT                         
---------- ------------------------------
        1 begin null; end;    

begin
 dbms_job.change(1, 'begin null; commit; end;', null, null);
end;
/
commit;

select job, what from user_jobs;

      JOB WHAT                         
---------- ------------------------------
        1 begin null; commit; end;  

引用自:https://dba.stackexchange.com/questions/154845