Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
用PLSQL解析xml文件_Xml_Oracle_Plsql - Fatal编程技术网

用PLSQL解析xml文件

用PLSQL解析xml文件,xml,oracle,plsql,Xml,Oracle,Plsql,在PLSQL中解析一个xml文件时遇到问题。我想说的是,我对其他一些xml文件的代码没有问题,尤其是这一个。 因此,我正在等待一些线索,以了解我应该在这个xml文件中看到的导致问题的内容 以下是PLSQL中的代码: filename := 'name_of_my_file.xml'; myParser := DBMS_XMLPARSER.newParser; ficContent := DBMS_XSLPROCESSOR.Read2Clob(directoryWhereToFindTheFile

在PLSQL中解析一个xml文件时遇到问题。我想说的是,我对其他一些xml文件的代码没有问题,尤其是这一个。 因此,我正在等待一些线索,以了解我应该在这个xml文件中看到的导致问题的内容

以下是PLSQL中的代码:

filename := 'name_of_my_file.xml';
myParser := DBMS_XMLPARSER.newParser;
ficContent := DBMS_XSLPROCESSOR.Read2Clob(directoryWhereToFindTheFile, filename , '0');
这是问题发生的地方:

DBMS_XMLPARSER.parseBuffer(myParser,ficContent);
Oracle错误:

ORA-06502 : PL/SQL : numeric or value error
你知道我应该看什么吗

注:我想我应该补充一些东西

这个特定的xml文件只写了两行,这导致Read2Clob出现了一些问题,因为行太长了。所以我在IDE中格式化了它,以获得一个好的xml文件,我使用了这个文件。读取该文件不再有问题,但会发生此错误。

在XML文件中,在XML代码之后编写以下代码行-

<...XML code...>
BEGIN
FOR r IN (
  SELECT ExtractValue(Value(p),'/row/name/text()') as clo1
      ,ExtractValue(Value(p),'/row/Address/State/text()') as col2
      ,ExtractValue(Value(p),'/row/Address/City/text()') as col3
FROM   TABLE(XMLSequence(Extract(x,'/person/row'))) p
) LOOP
-- do whatever you want 
END LOOP;
END;

以下是对问题的评论:

您的代码如下所示:

filename := 'name_of_my_file.xml';
myParser := DBMS_XMLPARSER.newParser;
ficContent := DBMS_XSLPROCESSOR.Read2Clob(directoryWhereToFindTheFile, filename , '0');
DBMS_XMLPARSER.parseBuffer(myParser,ficContent);
有关DBMS_XSLPROCESSOR.Read2Clob的规范:

语法

另一方面,DBMS_XMLPARSER.parseBuffer接受VARCHAR2作为第二个参数,您在那里传递一个CLOB,这是可以的,它隐式地转换为VARCHAR2,只要它适合VARCHAR2的大小,根据您的数据库版本和配置,它的大小可以从4k到32k字节不等

现在CLOB的大小是4GB-14GB-1,这比最大的VARCHAR2大得多

因此,显然这解决了问题

至于什么时候使用parseBuffer或parseClob,我想你明白了。不过我想,parseClob会在内部为它从接收到的CLOB中分离出来的4k字节的每一部分调用parseBuffer,但这只是一个猜测,我无法想象他们会为同一件事使用不同的代码,但是,嘿,这发生在遗留的东西上:-


干杯

一个工作和不工作XML的示例会有很大帮助。内容是一样的,只是不工作的XML有两行,而工作的XML每行有一个节点。格式化我认为您应该首先使用PARSECLOB,而不是PARSEBUFFER,这可能是您的问题。在当前情况下,您正在解析VARCHAR2,在工作XML的情况下,它可能低于VARCHAR24k或32k的大小限制,这取决于另一种情况-它只是超过了它,因为您正在传递一个CLOB,它隐式地转换为VARCHAR2。您的东西可以工作!!!把它作为我可以验证的答案,向我解释什么时候应该使用parsebuffer和parseclob。
DBMS_XSLPROCESSOR.READ2CLOB(
   flocation     IN   VARCHAR2,
   fname         IN   VARCHAR2,
   csid          IN   NUMBER:=0)
   RETURN CLOB;