用PLSQL解析xml文件

Posted

技术标签:

【中文标题】用PLSQL解析xml文件【英文标题】:parsing xml file with PLSQL 【发布时间】:2017-12-14 13:52:47 【问题描述】:

我在解析 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 样本会有很大帮助。 内容相同,只是“不工作”的有2行,“工作”的每行有一个节点。(格式化) 我认为你应该首先使用PARSECLOB,而不是PARSEBUFFER,这可能是你的问题。在当前情况下,您正在解析 VARCHAR2,在“工作”XML 的情况下,它可能低于 VARCHAR2(4k 或 32k,取决于)的大小限制,而在另一种情况下 - 它只是超过了它,因为你'无论如何都要传递一个 CLOB,它会隐式转换为 VARCHAR2。 你的东西有效!把它作为我可以验证的答案,向我解释什么时候应该使用 parsebuffer 和 parseclob。 【参考方案1】:

在您的 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;

【讨论】:

【参考方案2】:

按照问题下方的cmets:

您的代码如下所示:

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 [LINK]的规范:

语法

DBMS_XSLPROCESSOR.READ2CLOB(
   flocation     IN   VARCHAR2,
   fname         IN   VARCHAR2,
   csid          IN   NUMBER:=0)
   RETURN CLOB;

另一方面,DBMS_XMLPARSER.parseBuffer 接受 VARCHAR2 作为第二个参数,并且您在那里传递了一个 CLOB,这没关系(它被隐式转换为 VARCHAR2),只要它适合大小VARCHAR2 的个数(范围从 4k32k,以字节为单位,具体取决于您的数据库版本和配置)。

现在CLOB 的大小为4 GB - 1(4 Giga Bytes - 1),比最大的VARCHAR2 大得多。

因此,显然这解决了问题。

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

干杯

【讨论】:

以上是关于用PLSQL解析xml文件的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 中的 XML 解析

使用 PLSQL 将 XML 解析为数据库表

PLSQL:将数据从 XML 解析并插入到表中

怎么用c语言解析xml文件

用jdom解析xml文件时如何解决中文问题?如何解析?

解析xml文件,如何动态的封装成一个java类