1 使用dba 角色登录到oracle 赋予用户(hly201907) 使用UTL_FILE 的权限
GRANT EXECUTE ON UTL_FILE TO hly201907;
2 创建工作文件夹(D:/TEMP) 并为它起一个别名 (D_OUTPUT )
create or replace directory D_OUTPUT as 'D:/TEMP';
3使用dba 角色登录到oracle 赋予用户(hly201907) 读写文件夹的权限
grant read,write on directory D_OUTPUT to hly201907;
4 创建存储过程 (最后把数据刷到文件中)
create or replace PROCEDURE TEST AS
V_FILE UTL_FILE.FILE_TYPE;
L_BUFFER VARCHAR2(4000);
V_SqlString VARCHAR2(2000);
BEGIN
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'w');-- 写文件
-- 定义sql 语句
V_SqlString := 'select to_char(sysdate,'|| '''yyyy-mm-dd hh24:mi:ss''' || ') from dual';
-- 执行sql 语句 并把结果赋值给L_BUFFER
execute immediate V_SqlString into L_BUFFER;
-- 把L_BUFFER 写入到文件 连续写入三次
UTL_FILE.PUT_LINE(V_FILE, L_BUFFER);
UTL_FILE.PUT_LINE(V_FILE, L_BUFFER);
UTL_FILE.PUT_LINE(V_FILE, L_BUFFER);
-- 这里关闭文件。
UTL_FILE.FCLOSE(V_FILE);
NULL;
END TEST;
5 创建存储过程 ( 每次添加,次次刷新)
create or replace PROCEDURE TEST AS
V_FILE UTL_FILE.FILE_TYPE;
L_BUFFER VARCHAR2(4000);
V_SqlString VARCHAR2(2000);
BEGIN
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'w');-- 写文件
-- 定义sql 语句
V_SqlString := 'select to_char(sysdate,'|| '''yyyy-mm-dd hh24:mi:ss''' || ') from dual';
-- 执行sql 语句 并把结果赋值给L_BUFFER
execute immediate V_SqlString into L_BUFFER;
-- 把L_BUFFER 写入到文件
UTL_FILE.PUT_LINE(V_FILE, L_BUFFER);
-- 这里关闭文件。
UTL_FILE.FCLOSE(V_FILE);
-- 读取文件
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'a');
-- 定义sql 语句
V_SqlString := 'select to_char(sysdate,'|| '''yyyy-mm-dd hh24:mi:ss''' || ') from dual';
-- 执行sql 语句 并把结果赋值给L_BUFFER
execute immediate V_SqlString into L_BUFFER;
-- 把L_BUFFER 写入到文件
UTL_FILE.PUT_LINE(V_FILE, L_BUFFER);
-- 这里关闭文件。
UTL_FILE.FCLOSE(V_FILE);
NULL;
END TEST;
6 这样会把要输出的文件输出到指定的文件中(D:/TEMP/Data.txt)。
7 可以把输出数据(或日志)的SQL 单独写到一个存储过程中,如下。
create or replace procedure OUTPUT_LOG(fileName IN VARCHAR2,message IN VARCHAR2 ) is
-- 需要两个参数 第一个参数是输出的文件名称 第二个参数是要输出的字符串
V_FILE UTL_FILE.FILE_TYPE;
V_SqlString VARCHAR2(200);
V_message VARCHAR2(200);
begin
V_SqlString := 'select to_char(sysdate,'|| '''yyyy-mm-dd hh24:mi:ss''' || ') from dual';
execute immediate V_SqlString into V_message;
V_message :=message||'-------------'||V_message;
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', fileName||'.log', 'a');-- 写文件
UTL_FILE.PUT_LINE(V_FILE, V_message);
-- 这里关闭文件。
UTL_FILE.FCLOSE(V_FILE);
end OUTPUT_LOG;
8 输出数据(日志) 的存储过程调用方式,例如在plsql中
BEGIN
OUTPUT_LOG('2019-09-16','TEST');
END;
9 这样 会在目录D_OUTPUT (D:/TEMP) 中添加一个当天日期的文件2019-09-16.log 文件,其中的数据是
TEST---------------------2019-09-16 18:09:58
。