附加到提取的文件

时间:2014-02-06 07:33:21

标签: sql oracle

我有一个程序,它将EDW中的数据提取到Business Objects中要使用的另一个用户的文件中。

我使用游标选择我需要的数据,然后在for循环中运行它,如下所示:

FOR x IN c_body LOOP

utl_file.put_line(out_file, x.data_line);
END LOOP;

  utl_file.fclose(out_file);
  DBMS_OUTPUT.PUT_LINE('copy file from ' ||lv_path||'/'||lv_filename|| ' to '                               ||lv_pub_path||'/'||lv_filename);
  OSUTIL.RUNOSCMD('cp -f '||lv_path||'/'||lv_filename||' '||lv_pub_path, lv_os_out, ln_os_num);

  IF ln_os_num != 0 THEN
    dbms_output.put_line('copy file '||lv_filename||' failed. error = ' || lv_os_out || ' ' || ln_os_num);
    RAISE exit_now;
  END IF;

有没有办法让我可以多次运行该程序,只是附加到提取的文件? 我目前正在运行2年历史数据的大量摘录,宁愿多次使用较小的集合,而不是使用整整24个月(这将需要永远)。

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

您可以使用UTL_FILE附加fopen的附加打开模式追加到文件:

  

open_mode:指定文件的打开方式。模式包括:

     
      
  • r - 阅读文字
  •   
  • w - 写文字
  •   
  • a - 追加文字
  •   
  • rb - 读取字节模式
  •   
  • wb - 写字节模式
  •   
  • ab - 追加字节模式
  •   

在您的情况下,您还可以写入24个(不同的)文件,以便您可以同时运行多个过程,然后合并结果文件。

答案 1 :(得分:1)

你可以open the file in append mode而不是写模式:

out_file := UTL_FILE.FOPEN('DIR', lv_filename, 'a');

如果你想每次都创建一个新文件,但是附加到你要复制的目标文件,那么你可以在OS leve那样做:

OSUTIL.RUNOSCMD('cat '||lv_path||'/'||lv_filename||' >> '||lv_pub_path,
  lv_os_out, ln_os_num);

无论哪种方式,您都需要确保在多次运行的第一次开始之前没有文件或空文件,或者您必须重新启动整个文件。问题有多大取决于你决定何时分割他的运行方式以及如何命名文件等等。