xml - 在 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?
提前致谢!标记
解决方案
在 10g 中使用 PL/SQL 没有可行的解决方法,这是一个内部限制。XMLTYPE 是在限制节点 < 64k 的情况下构建的。要么升级到至少 11g,要么为 10.2.0.3 应用补丁集
错误 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
推荐阅读
- javascript - 如何将多个类似的 javascript 实例转换为一个全局函数?
- mysql - SQL 左连接左连接表上的表
- dart - Flutter 简单的实现来处理 Bloc 工作一次的点击事件
- c++ - 如何跳过 QFile 的 N 行而不将它们临时存储在 QStrings 中?
- javascript - 使用变换将 div 滑入 div
- blazor - Blazer 服务器端 + AspNetCore.Identity
- javascript - 有没有办法获得经过 firebase 身份验证的 github 用户的用户名
- google-app-engine - 如何设置多个 URL 指向同一个 flex App Engine?
- android - RelativeLayout 内 ScrollView 的 Wrap_Content 生成空白空间
- php - 如何从 laravel 中的 json 数组中获取数据