簡化PLSQL調試的記錄一致性錯誤日志_第1頁
簡化PLSQL調試的記錄一致性錯誤日志_第2頁
簡化PLSQL調試的記錄一致性錯誤日志_第3頁
簡化PLSQL調試的記錄一致性錯誤日志_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、從事Oracle數據庫方面的工作已有一年有余了,我最喜歡的部分是PL/SQL。這是Oracle的數據可編程語言,使用它可以將過程化代碼與SQL代碼結合在一起。最令人喜歡的是我們可以使用它在一個地方開發(fā)整個應用。所有的數據選擇和更新,所有與LDAP交互的HTTP和HTML俞出,以及其它所有事情都可以使用一種語言在一個地方完成。但是其缺點是應用程序十分復雜。因為PL/SQL代碼中的一個特定過程或函數可能要完成上面諸多任務中的任何一個,這樣當出現問題時,調試查找錯誤變得十分困難。這是數據庫的問題,還是使用LDAP寸HTTP的問題?問題在哪里 ?在每個PL/SQL項目中我喜歡使用一種簡單的錯誤日志記錄

2、機制,這樣當出現問題時,我有一個可以查看的簡單數據表來跟蹤所有錯誤。我通過構建一個日志數據表開始介紹:CREATE TABLE ERRORLOGIDNUMBERNOT NULL,TIMEDATENOT NULL,CODEVARCHAR2(9 BYTE)NOT NULL,MESSAGEVARCHAR2(2000 BYTE)NOT NULL,P ACKAGE_NAMEVARCHAR2(100 BYTE),p rocedure_namevarchar2(100 byte)not null,LOCATIONNUMBER,P ARAMETERSVARCHAR2(4000 BYTE);與其它大多數數據庫不

3、同,Oracle中沒有內置的用于對ID自動增加的字段域。所以,我們需要創(chuàng)建一個序列,然后添加某些機制實現在一個新值插入時賦予一個序列值。下面是我們的序列:CREATE SEQUENCE ERRORLOG ID SEQMINVALUE 1MAXVALUE 999999999999999999999999999INCREMENT BY 1START WITH 1CACHE 20NOORDERNOCYCLE ;我們可以使用觸發(fā)器插入時間戳,我們稍后會在提供日志接口的包中實現。該觸發(fā)器完成的操作是利用我們上面創(chuàng)建的序列遞增ID域。CREATE OR REP LACE TRIGGER T ERRORLO

4、G BlBEFORE INSERTON ERRORLOGREFERENCING OLD AS OLD NEW AS NEWFOR EACH ROW begin if :new.id is null then select errorlog_id_seq.nextval into :new.id from dual;end if;end t_errorlog_bi;在實際應用中對數據表提供一個主鍵是十分有益的。我知道我們可以在創(chuàng)建表格時設定主鍵,但是我喜歡以后單獨完成這項工作。我不知道為什么,只是感覺這樣做更清楚一些。ALTER TABLE ERRORLOG ADD (P RIMARY KEY

5、(ID);PL/SQL是基于古老的Ada程序設計語言的,因此在創(chuàng)建一個包時,需要提供兩部分:規(guī)格說明(接口)部分和主體部分接口的真正實現。對于我們簡單的錯誤日志記錄包,規(guī)格說明部分只提供一個單一過程:CREATE OR REP LACE p ackage p kg_error is p rocedure log (p_error_code errorlog.code%t ype.p_error_message errorlog.message%t ype.p_p ackage errorlog .p ackage_name%t ype default null, p_p rocedure er

6、rorlog .p rocedure_name%t ype.p_location errorlog.location%t ype default null, p_p arameters errorlog .p arameters%t ype default null);end p kg_error;在主體部分,可以包含任意多個你想要的過程和函數。至少,它必須實現規(guī)格說明中的過程和函數。在本例中,包的主體部分只實現規(guī)格說明中的一個過程:CREATE OR REP LACE package body p kg_error is p rocedure log (p_error_code errorl

7、og.code%t ype.p error message errorlog.message%t ype.p_p ackage errorlog .p ackage_name%t ype default null, p_p rocedure errorlog .p rocedure_name%t ype.p_location errorlog.location%t ype default null, p_p arameters errorlog .p arameters%t ype default null) is p ragma autonomous_transaction;begin in

8、sert into errorlog (time, code, message, p ackage_name, p rocedure_name, location, p arameters) values (sysdate, p_error_code, p_error_message, p_p ackage, p_p rocedure, p_location, p_p arameters);commit;end log;end p kg_error;p ragma其中pragma autonomous_transaction部分是十分重要的,因為你保證log方法能夠將日志數據提交到數據表中,否

9、則要提交過程中導致錯誤發(fā)生的任何相關信息。這就是段完成的功能。它告訴Oracle將該過程作為原子操作,不能影響早期調用堆棧中的任何信息。當然最后一步是將日志信息應用到代碼中。例如,比如說你有一個簡單的小函數,并且無論何時發(fā)生異常,你都希望能夠記錄它且還要避免再次發(fā)生錯誤。換句話說,記錄錯誤并使應用能夠繼續(xù)運行。你可能需要做以下工作:RETURN VARCHAR2CREATE OR REP LACE FUNCTION hello worldISv_ p rocedure errorlog .p rocedure_name%T YPE default helloworld: v_ location

10、 errorlog.location%T YPE;BEGIN v_location := 1000;return (hello, world);EXCE PTION when others thenP kg_error.log(p_error_code = substr(sqlerrm,1,9).p_error_message = substr(sqlerrm,12), p_p ackage = FUNCTION, p_p rocedure = v_p rocedure, p_location = v_location);p_package參數替代我們此處使用的字符串常量。END;很明顯,如果是在包內,你需要根據你創(chuàng)建的包的實際名稱創(chuàng)建

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論