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