oracle 存儲過程小結

 create or replace procedure EK_GET_EMPLOYEE_NUM is

       s_lastDate        DATE;           --最後更新時間              // 定義變量
       s_currDate        DATE;           --當前更新時間

begin
    
  s_currDate := sysdate;
  select s.f_last_date into s_lastDate from EK_LOG_SYNC s where s.f_tbale_name = 'T_Ent_User_Dir';
 
update siebel.S_ORG_EXT_X t set (attrib_16)=(    //這裏面及易報錯,例如單行子查詢返回多行
    select m."F_FactCount" from siebel.S_ORG_EXT o
    left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
    where m."F_FactCount" is not null and o.row_id = t.row_id
)where exists
(
select 1 from siebel.S_ORG_EXT o
    left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
    where m."F_FactCount" is not null and o.row_id = t.row_id
);

 update EK_LOG_SYNC s set s.f_last_date = s_currDate where s.f_tbale_name = 'T_Ent_User_Dir';
 INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功');
commit;   //注意提交事物

exception    //出現異常時執行
  when others then
  DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);      //輸出出錯日誌信息
      DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
    rollback;
      INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失敗');
    commit;
 
end EK_GET_EMPLOYEE_NUM;

昨天肚子太餓了,寫到這裏沒有力氣寫下去,今天繼續哈!

接下來說說存儲過程的調用和跟蹤, 寫了存儲過程編譯通過後,它並不會執行,而是要放在Job 中去執行,而且還可以設置其執行的時間和頻率,截圖來看看:



jobs的新建和配置的話,請參考另一篇日誌,我已經在網上找到了,這裏先不具體說,這裏只要知道jobs是用來執行存儲過程的就OK!
接下來說說存儲過程的跟蹤,如果只是可以執行顯然不完善,因爲如果這樣執行出錯了你也不知道,所以存儲過程中有對成功或者失敗的跟蹤代碼:
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功');  //這是成功的代碼

如果執行出現異常,在異常中處理跟蹤信息:
exception    //出現異常時執行
  when others then
  DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);      //輸出出錯日誌信息
      DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
    rollback;
      INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失敗');
    commit;

這裏的在ORACLE中新建了一張test 表用來記錄成功或者失敗信息, 失敗的時間,和同步失敗的信息在出錯的情況下會被寫到這張表中!


這樣,只要打開這張表,就可以查看各個存儲過程是否正常運行,如果出錯就要去排查錯誤了! 但是這個還需要改進,因爲記錄的信息太少 了,根本無法知道是因爲什麼原因出錯!所以,接下來要進行這個跟蹤信息的改善工作!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章