在编写oracle的存储过程中,调试比较麻烦,在此采用oracle的一个输出包,来创建一个存储过程log_write,
创建好后,其他的存储过程中只需调用这个log_write 即可。调用方式:log_write(‘我是调试信息’);
实现原理:采用UTL_FILE包的功能进行创建log文件以及输出log信息
Oracle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件。
UTL_FILE.FOPEN(location in varchar2,filename in varchar2, open_mode in varchar2) return FILE_TYPE;
Location 是路径参数,
FILENAME 是文件名,
OPEN_MODE是打开模式,'R'是读文本,'W'是写文本,'A'是附加文本,参数不分大小写,如果指定'A'但是文件不存在,它会用'W'先创建出来,'W'有覆盖的功能;
其中的location并不能简单的指定为'D:\temp'等路径,要建立一个DIRECTORY变量并付给权限(必须以DBA身份登录):
sql代码:
create or replace directory D_OUTPUT as 'D:\TEMP';
grant read, write on directory D_OUTPUT to public;
注:如上述代码所示,在D盘需要手动创建命名为TEMP的文件夹,执行上述代码,并不会自动创建相关文件夹,上述代码在于定义,并赋予该定义的权限,此处是public
之后就可以用UTL_FILE包建立文件了:
FILE_HANDLE :=UTL_FILE.FOPEN('D_OUTPUT','log.txt','A');
写文件以及关闭:
UTL_FILE.put_line(FILE_HANDLE,write_string);
UTL_FILE.FCLOSE(FILE_HANDLE);
完整步骤:
1. 在D盘创建一个文件夹,用来存放log信息,本实例创建的文件夹名为:TEMP
2. (PL/SQL)运行sql脚本,注意创建的文件夹路径需保持一致
create or replace directory D_OUTPUT as 'D:\TEMP';
grantread, write on directory D_OUTPUT to public;
3.新建一个存储过程 log_write ,文件的命名规则为:"当天日期"+"-log",每天会新建一个新的log.txt 如下图:
CREATE OR REPLACE Procedure log_write (dispaly_string In Varchar2)
As
FILE_HANDLE UTL_FILE.FILE_TYPE;
pro_date date;
Begin
select sysdate into pro_date from dual;
FILE_HANDLE := UTL_FILE.FOPEN('D_OUTPUT', to_char(pro_date,'yyyy-mm-dd')||'-log.txt', 'A');
UTL_FILE.put_line(FILE_HANDLE,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--------'||dispaly_string);
--UTL_FILE.put_line(FILE_HANDLE,dispaly_string);
UTL_FILE.FCLOSE(FILE_HANDLE);
End log_write;
/