ORACLE 存储过程 输出数据到 指定文件

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_29461579

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值