Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORA-06502:PL/SQL:尝试将XML保存到文件时出现数字或值错误_Xml_Database_Oracle_Plsql - Fatal编程技术网

ORA-06502:PL/SQL:尝试将XML保存到文件时出现数字或值错误

ORA-06502:PL/SQL:尝试将XML保存到文件时出现数字或值错误,xml,database,oracle,plsql,Xml,Database,Oracle,Plsql,我试图将使用函数GENERATE_XML_从_表创建的XMLTYPE数据保存到文件中。当我尝试保存少量字符时,一切正常。但对于较大的大小,它会导致错误“当试图将XML保存到文件中时出现数字或值错误” 的缓冲区的最大大小为32767,除非在fopen()中指定了较小的大小;默认的最大行大小为1024个字符 基本上,您需要将CLOB分块写入,还可以使用更大的缓冲区: PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2) IS FILE_TO_SA

我试图将使用函数GENERATE_XML_从_表创建的XMLTYPE数据保存到文件中。当我尝试保存少量字符时,一切正常。但对于较大的大小,它会导致错误“当试图将XML保存到文件中时出现数字或值错误”


的缓冲区的最大大小为32767,除非在
fopen()
中指定了较小的大小;默认的最大行大小为1024个字符

基本上,您需要将CLOB分块写入,还可以使用更大的缓冲区:

PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2)
IS
   FILE_TO_SAVE   UTL_FILE.FILE_TYPE;
   XMLCLOB        CLOB;
   POSITION       PLS_INTEGER := 1;
   CHARS          PLS_INTEGER := 32767;
   BUFFER         VARCHAR2(32767);
BEGIN
   XMLCLOB := GENERATE_XML_FROM_TABLE (TARGET_TABLE).GETCLOBVAL ();

   FILE_TO_SAVE := UTL_FILE.FOPEN ('DATA', 'CLASSIF.xml', 'W', CHARS);

   WHILE POSITION < DBMS_LOB.GETLENGTH (XMLCLOB) LOOP
      DBMS_LOB.READ (XMLCLOB, CHARS, POSITION, BUFFER);
      UTL_FILE.PUT (FILE_TO_SAVE, BUFFER);
      UTL_FILE.FFLUSH (FILE_TO_SAVE);
      POSITION := POSITION + CHARS;
   END LOOP;

   UTL_FILE.FCLOSE (FILE_TO_SAVE);
END;
/
过程将XML保存到文件(目标表格VARCHAR2)
是
文件\保存UTL\ U文件。文件\类型;
XMLCLOB-CLOB;
位置PLS_整数:=1;
字符PLS_整数:=32767;
缓冲区VARCHAR2(32767);
开始
XMLCLOB:=从_表(TARGET_表)生成_XML_;
要保存的文件:=UTL\u FILE.FOPEN('DATA','CLASSIF.xml','W',CHARS);
而位置
我在``fopen()`调用中添加了
CHARS
,因此将是32767。然后,我将CLOB以32767个字符的数据块读入缓冲区,然后写入并——重要的是——刷新每个缓冲区


如果CLOB中的XML没有换行符,您仍然会遇到问题,但希望它是经过修饰的;如果没有,您可以在编写之前使用XMLSerialise来实现这一点。

您使用的是Oracle的哪个版本,以及哪一行引发异常?在问题中包含整个异常堆栈可能会很有用。使用ORACLE 10g,此行抛出异常:UTL_FILE.PUT(FILE_TO_SAVE,XMLCLOB)。完整堆栈:[错误]执行(1:3):ORA-06502:PL/SQL:数字或值错误ORA-06512:“将XML保存到文件”第7行谢谢您的帮助。是的,XML没有换行符,所以我在XML generate的末尾添加了.extract('/*'),现在一切正常了
PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2)
IS
   FILE_TO_SAVE   UTL_FILE.FILE_TYPE;
   XMLCLOB        CLOB;
   POSITION       PLS_INTEGER := 1;
   CHARS          PLS_INTEGER := 32767;
   BUFFER         VARCHAR2(32767);
BEGIN
   XMLCLOB := GENERATE_XML_FROM_TABLE (TARGET_TABLE).GETCLOBVAL ();

   FILE_TO_SAVE := UTL_FILE.FOPEN ('DATA', 'CLASSIF.xml', 'W', CHARS);

   WHILE POSITION < DBMS_LOB.GETLENGTH (XMLCLOB) LOOP
      DBMS_LOB.READ (XMLCLOB, CHARS, POSITION, BUFFER);
      UTL_FILE.PUT (FILE_TO_SAVE, BUFFER);
      UTL_FILE.FFLUSH (FILE_TO_SAVE);
      POSITION := POSITION + CHARS;
   END LOOP;

   UTL_FILE.FCLOSE (FILE_TO_SAVE);
END;
/