oracle使用存储过程写出txt文件

 
 由于工作需要,需要将oracle表中的记录写成txt文件,表中一共有1000多天数据,需要每天写一个txt文件,如果只生成一个,用pl/sql 导出就行,但是1000多个文件只能由程序搞定了。
       百度了一下,查到了UTL_FILE 这个包,可以操纵文件。

   (1 ) 建立目录并授权

         create directory txtdir as '/txtdir';
         grant read,write on directory txtdir to quot;

    (2) 用 quot用户执行存储过程

CREATE OR REPLACE PROCEDURE write_quot_data
 IS
       file_handle UTL_FILE.file_type;
BEGIN
  FOR T_DATE IN (SELECT TRADE_DATE FROM TEST_TRADE_DATE WHERE TRADE_DATE>=20080101 AND TRADE_DATE<=20080104 ORDER BY TRADE_DATE) LOOP
          
        file_handle := UTL_FILE.FOPEN('txtdir',T_DATE.TRADE_DATE || '.txt','w');
          FOR x IN (SELECT * FROM test2 WHERE TRADE_DATE=T_DATE.TRADE_DATE) LOOP
            UTL_FILE.PUT_LINE(file_handle, X.TRADE_DATE || ',' ||to_char(nvl(X.PRICE,'0'),'FM9999990.00')|| ','||to_char(nvl(X.closeprice,'0'),'FM9999990.00') || ',' ||to_char(nvl(X.qty,'0'),'FM99999999999') );
          END LOOP;
            UTL_FILE.FCLOSE(file_handle);
      
   END LOOP;     
   EXCEPTION WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,2000));
END;
/
       
  (3 ) 执行存储过程
    执行成功后txtdir目录中多了N多文件,哈哈,搞定了。
   有个小插曲是 用户要求 null必须格式化为 0.00 , 以前用的是 nvl(X.PRICE,'0.00'),不好用
    这个用 to_char(nvl(X.PRICE,'0'),'FM9999990.00')搞定 ,注意price的最大位数是9999990,不够的话自己再加几个9吧
    
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值