在Oracle 10g上加载64K以上的XML



我在Oracle 10g上工作我必须将一个大的XML加载到XMLTYPE列中,以便轻松地提取一些TAG的内容。问题是在加载XML的过程中,我得到了

ORA-31167:无法插入大小超过64K的XML节点

我已经读到,在Oracle10g上,为一个XML加载超过64K是不可能的。这对我来说太可怕了,因为我想我应该把大XML加载到CLOB列中,但之后我怎么能找到我感兴趣的TAG呢?此外,一些TAG是重复的,我知道TAG的名称及其TAG父,如果我能使用XML函数,一切都会非常简单。你有什么建议吗?有人开发过任何函数来提取包含在和之间的CLOB部分吗?这将是包含我必须使用的内容的两个TAG,以便将其转换为较小的XMLTYPE?

提前感谢!标记

使用PL/SQL在10g中无法解决问题,这是一个内部限制。XMLTYPE是在节点<64k。要么升级到至少11g,要么应用10.2.0.3 的补丁集

错误4766097插入后无法从XMLType提取内容-ORA-31167

第一路

如果你不能升级,至少你可以将补丁集应用到10.2.0.3,在那里问题得到了解决。10g是一个非常旧的版本,所以你可能会发现自己有很多问题和头痛,所以你应该考虑升级,越快越好。

第二路

10.2.0.3之前的10g有一个可能的解决方案,,但不能保证

  1. 将XML文档存储为CLOB
  2. 读取元素的文本/值>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

最新更新