Sql 附加到提取的文件

Sql 附加到提取的文件,sql,oracle,Sql,Oracle,我有一个过程,将数据从EDW提取到一个文件中,供业务对象中的另一个用户使用 我使用光标选择所需的数据,然后在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

我有一个过程,将数据从EDW提取到一个文件中,供业务对象中的另一个用户使用

我使用光标选择所需的数据,然后在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个月(这将花费永远的时间)


提前感谢您的帮助

您可以使用
UTL_file
附加到文件,附加打开模式为:

打开模式
:指定如何打开文件。模式包括:

  • r——读文本
  • w——写文本
  • a--追加文本
  • rb—读取字节模式
  • wb—写入字节模式
  • ab—附加字节模式

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

您可以使用
UTL\u file
附加到文件,附加打开模式为:

打开模式
:指定如何打开文件。模式包括:

  • r——读文本
  • w——写文本
  • a--追加文本
  • rb—读取字节模式
  • wb—写入字节模式
  • ab—附加字节模式
在您的情况下,您还可以写入24个(不同)文件,以便可以同时运行多个过程,然后合并结果文件。

您可以使用以下方式代替写入模式:

out_file := UTL_FILE.FOPEN('DIR', lv_filename, 'a');
如果每次都要创建一个新文件,但要附加到要复制到的目标文件,则可以在OS级别执行此操作:

OSUTIL.RUNOSCMD('cat '||lv_path||'/'||lv_filename||' >> '||lv_pub_path,
  lv_os_out, ln_os_num);
无论哪种方式,您都需要确保在多次运行的第一次开始之前没有文件或空文件,或者如果您必须重新启动整个过程。问题的严重程度取决于您如何决定何时拆分其运行以及文件的命名方式等。

您可以使用以下方式代替写入模式:

out_file := UTL_FILE.FOPEN('DIR', lv_filename, 'a');
如果每次都要创建一个新文件,但要附加到要复制到的目标文件,则可以在OS级别执行此操作:

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

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

您是指使用
utl\u文件
写入的文件,还是在操作系统中复制的目标文件?您是指使用
utl\u文件
写入的文件,或者你在操作系统中复制的目标文件?