在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JDBC 将 Java 存储过程加载到 Oracle 10g 中?

在 oracle 10g 中使用表分区

在 oracle 10g 中更新查询需要很长时间

如何在 Oracle 10g 中获取无效对象的错误列表

.dex 文件中的方法引用数超过 64K

oracle 10g - 监控大行删除