在 Oracle 10g 上加载超过 64K 的 XML
Posted
技术标签:
【中文标题】在 Oracle 10g 上加载超过 64K 的 XML【英文标题】:XML over 64K on Oracle 10g to load 【发布时间】:2020-07-21 13:40:36 【问题描述】:我在 Oracle 10g 上工作 我必须将一个大的 XML 加载到一个 XMLTYPE 列中,以便轻松提取一些 TAG 的内容。 问题是在加载 XML 期间我得到了
ORA-31167:无法插入大小超过 64K 的 XML 节点
并且我已经读到 是不可能的。这对我来说太可怕了,因为我想我应该将大 XML 加载到 CLOB 列中,但是之后我怎么能找到我感兴趣的标签? 此外,一些 TAG 是重复的,我知道 TAG 的名称及其 TAG-father,如果我可以使用 XML 函数,一切都会非常简单。 你有什么建议吗?是否有人开发了任何函数来提取其中包含的 CLOB 部分,这将是两个 TAG 包含我必须使用的内容,以便将其转换为更小的 XMLTYPE?
提前致谢! 标记
【问题讨论】:
您可以将 clob 转换为 xmltype 【参考方案1】:在 10g 中使用 PL/SQL 没有可行的解决方法,这是一个内部限制。 XMLTYPE 是在限制节点
错误 4766097 插入后无法从 XMLType 中提取内容 - ORA-31167
第一种方式
如果无法升级,至少可以将补丁集应用到问题已解决的 10.2.0.3。 10g是一个非常非常老的版本,所以你可能会发现自己会遇到很多问题和头疼的问题,所以你应该考虑升级,越快越好。
第二种方式
在 10.2.0.3 之前的 10g 中有一个可能的解决方法,但不能保证。
-
将 XML 文档存储为 CLOB。
读取元素的文本/值 > 64k 使用 Java DOM API
这2个例子是:
import java.io.*;
import org.w3c.dom.*;
import org.w3c.dom.Node;
import oracle.xml.parser.v2.*;
public class DOMSample
static public void main(String[] argv)
try
System.out.println("XDK version is " + oracle.xml.parser.v2.XMLParser.getReleaseVersion());
// Build XML document with text > 64k
StringBuffer sb = new StringBuffer();
sb.append("<DOC>");
for (int i=1; i<=96000; i++)
sb.append("*");
sb.append("</DOC>");
String clobData = sb.toString();
System.out.println ("length of input XML " + clobData.length());
// Get an instance of the parser
DOMParser parser = new DOMParser();
parser.setErrorStream(System.err);
parser.showWarnings(true);
parser.parse(new ByteArrayInputStream(clobData.getBytes()));
// Obtain the document.
XMLDocument doc = parser.getDocument();
NodeList nl = doc.getElementsByTagName("*");
Node n;
for (int i=0; i<nl.getLength(); i++)
n = nl.item(i);
System.out.println("Element name " + n.getNodeName() );
n = n.getFirstChild();
if (n.getNodeType() == n.TEXT_NODE)
String out_text = n.getNodeValue();
System.out.println("Length of text in DOC tag " + out_text.length() );
//end for
System.out.println(" Done ");
parser.reset();
//end try
catch (Exception e)
System.out.println(e.toString());
// end main
// end Class
> export CLASSPATH=.:$ORACLE_HOME/lib/xmlparserv2.jar
> javac DOMSample.java
> java DOMSample
XDK version is Oracle XML Developers Kit 10.2.0.2.0 - Production
length of input XML 96011
Element name DOC
Length of text in DOC tag 96000
Done
【讨论】:
以上是关于在 Oracle 10g 上加载超过 64K 的 XML的主要内容,如果未能解决你的问题,请参考以下文章