无法使用UTL_FILE.PUT_LINE写入大尺寸数据

时间:2014-03-26 05:52:51

标签: xml oracle file-io

我创建了一个包含大量数据的xml。现在我试图将生成的xml写入文件。

声明:

prodFeed_file  UTL_FILE.FILE_TYPE;
prodFeed_file := UTL_FILE.FOPEN ('CSV_DIR', 'feed.xml', 'w', 32767); 

写入文件:

UTL_FILE.PUT_LINE(prodFeed_file,l_xmltype.getClobVal);

UTL_FILE.FCLOSE(prodFeed_file);

如果l_xmltype.getClobVal返回有限的记录,那么它就是工作文件,但如果l_xmltype.getClobVal超过了大小(差不多35 KB),则会出错:

ORA-06502: PL/SQL: numeric or value error

1 个答案:

答案 0 :(得分:10)

UTL_FILE documentation says

  

"缓冲区参数的最大大小为32767字节,除非您在FOPEN中指定较小的大小。 "

您必须按块编写CLOB块。像这样:

DECLARE
  v_clob CLOB;
  v_clob_length INTEGER;
  pos INTEGER := 1;
  buffer VARCHAR2(32767);
  amount BINARY_INTEGER := 32760;
  prodFeed_file utl_file.file_type;
BEGIN
  prodFeed_file := UTL_FILE.FOPEN ('CSV_DIR', 'productFeedLargo.xml', 'w', 32767);
  v_clob := l_xmltype.getClobVal;
  v_clob_length := length(v_clob);

  WHILE pos < v_clob_length LOOP
    dbms_lob.read(v_clob, amount, pos, buffer);
    utl_file.put(prodFeed_file , char_buffer);
    utl_file.fflush(prodFeed_file);
    pos := pos + amount;
  END LOOP;

  utl_file.fclose(prodFeed_file);

END;
/