首页 > 解决方案 > 在 Oracle 10g 上加载超过 64K 的 XML

问题描述

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

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

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

提前致谢!标记

标签: xmloracle

解决方案


在 10g 中使用 PL/SQL 没有可行的解决方法,这是一个内部限制。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

推荐阅读