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 表用來記錄成功或者失敗信息, 失敗的時間,和同步失敗的信息在出錯的情況下會被寫到這張表中!
這樣,只要打開這張表,就可以查看各個存儲過程是否正常運行,如果出錯就要去排查錯誤了! 但是這個還需要改進,因爲記錄的信息太少 了,根本無法知道是因爲什麼原因出錯!所以,接下來要進行這個跟蹤信息的改善工作!