Oracle dbms_output vs utl_file 使用(二)
UTL_FILE
UTL_FILE是Oracle用于读写外部文件的工具包。
在使用UTL_FILE前需要设置Oracle DIRECTORY映射外部文件目录。
--log_dir映射到/appl/gl/log
SQL> CREATE DIRECTORY log_dir AS '/appl/gl/log';
--将读写权限赋予DBA角色
SQL> GRANT READ ON DIRECTORY log_dir TO DBA;
SQL> GRANT WRITE ON DIRECTORY log_dir TO DBA;
--USER_DIR映射到/appl/gl/user
SQL> CREATE DIRECTORY USER_DIR AS '/appl/gl/user';
--将读写权限赋予PUBLIC角色(所有账号都可以用)
SQL> GRANT READ ON DIRECTORY USER_DIR TO PUBLIC;
SQL> GRANT WRITE ON DIRECTORY USER_DIR TO PUBLIC;
UTL_FILE有很多读写文件和创建删除文件的方法,因为我只是需要写log而且是一行一行写所以基本只用PUT_LINE()方法就够了。
declare
fileHandle UTL_FILE.FILE_TYPE;
begin
--打开文件(文件不能使用中文名), 32767是缓冲区最大值
fileHandle := UTL_FILE.FOPEN('OS_LOG_DIR', 'test_write_file.log', 'w', 32767);
--PUT_LINE 写一行字符串,一行的长度不能超出32767
UTL_FILE.PUT_LINE(fHandle, '写一行log......');
--关闭file
UTL_FILE.FCLOSE(fHandle);
end;
log文件:
![](https://i-blog.csdnimg.cn/blog_migrate/118613d66aea4b5804a82f7164381432.jpeg)
PUT_LINE()的定义:
UTL_FILE.PUT_LINE (
file IN FILE_TYPE, --FILE_TYPE 是UTL_FILE里面定义一个RECORD类型
buffer IN VARCHAR2,
autoflush IN BOOLEAN DEFAULT FALSE
);
参数说明:
Parameters | Descriptions |
file | Active file handle returned by an FOPEN call. FOPEN方法返回的file handler。 |
buffer | Text buffer that contains the lines to be written to the file. 包含要写入文件的行的文本缓冲区(文本内容) |
autoflush | Flushes the buffer to disk after the WRITE. WRITE之后是否自动刷新缓冲区。 |
注意:
缓冲区参数的最大大小为32767字节,除非在FOPEN中指定较小的大小。如果未指定,默认值1024。如果没有刷新缓冲区,所有PUT调用的总和不能超过32767。
如果文件已经被其它操作打开,则引发INVALID OPERATION异常。
UTL_FILE使用时主要步骤:
打开文件,UTL_FILE.FOPEN;
读写文件,get\get_line\put\put_line......
关闭文件,UTL_FILE.FCLOSE;
对比dbms_output & utl_file 写log的优劣
回归我的初冲是对比dbms_output & utl_file 写log优劣。
dbms_output 和 utl_file都有一行32767的长度限,但是utl_file还需要设置DIRECTORY和对应的目录权限这些通常是DBA才有权限做的事情,而dbms_output使用上更加简单。
在我这种简单的使用场景我会选择使用dbms_output,但是如果是写report的场景会选择使用utl_file。
UTL_FILE其它的文件操作方法请参考官方文档。
UTL_FILE官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/UTL_FILE.html
本文只是个人(EnergyNo8)学习笔记如有错误请网友指出。
如有引用或转载请标明出处!
努力、坚持,总会有收获!
______ EnergyNo8