?
在數(shù)據(jù)庫的開發(fā)中,當PL/SQL語句很復(fù)雜的時候,我想寫一些Log,就像java的Log4j那樣。這樣就可以很好的跟蹤程序的運行情況。在網(wǎng)上找到的文章不是很好用,修改了一下。
1:在Oracle服務(wù)器上建立一個目錄并指定權(quán)限(我這個是unix的。windows用c:\tmp之類的就行)
CREATE DIRECTORY TEMP AS '/tmp';
GRANT READ,WRITE ON DIRECTORY TEMP TO PUBLIC;
GRANT?? EXECUTE? ON? SYS.UTL_FILE? TO? YOU_USER_NAME;
如果出現(xiàn)權(quán)限錯誤的話,注意自己登陸的方式,我是用oralce用戶TelNet到Unix上的,然后connect / as sysdba。(windows 用戶應(yīng)該是:用sys用戶登錄到數(shù)據(jù)庫(ora9i):conn sys/password@oraclesid as sysdba ,sys用戶的缺省密碼和system一樣,都是manager)
2:寫Log文件的SQL語句如下:
declare
? file_handle utl_file.file_type;
? buff varchar2(20);
? cursor c1 is select? acloumn from t_atable;
begin
? file_handle := utl_file.fopen('TEMP',log.txt','w');
? open c1;
? loop
??? fetch c1 into buff;
??? exit when c1%notfound;
??? utl_file.put_line(file_handle,buff);
?? end loop;
?? close c1;
?? utl_file.fclose(file_handle);
end;
這樣,就應(yīng)該可以了,file_handle := utl_file.fopen('TEMP',log.txt','w');中的'w'是指write,也可以是'a',append.
封裝后是這樣的:
procedure writeLog(logMessage in Varchar2) is
? begin
??? IF logSwitch THEN
????? file_handle := utl_file.fopen('TEMP','x.txt','w');
????? utl_file.put_line(file_handle,logMessage);
????? utl_file.fclose(file_handle);
??? END IF;
? end;
其中l(wèi)ogSwitch 是boolean型,我定義在包中的。如果直接用的話可以是procedure writeLog(logMessage in Varchar2, logSwitch in boolean )