2

我在查询的选择部分使用以下语句:

extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')

如果doc.payload包含XML没有DTD声明,它工作得很好,但是当声明存在时引发错误,DTD因为 Oracle 尝试验证文档但找不到DTD.

如何禁用XML此查询的验证?我不想在这件事上影响我的会话设置或全局系统设置。

4

1 回答 1

4

您可以在创建 XMLTYPE 时关闭验证,构造函数签名如下所示:

XMLType(
   xmlData IN varchar2,
   schema IN varchar2 := NULL,
   validated IN number := 0,
   wellformed IN number := 0)

所以你可以像这样禁用验证:

   extract(XMLTYPE(doc.payload, NULL, 1, 1),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')

但是,如果您有外部 DTD 引用,这对您没有帮助。它仍然会尝试加载它。不能将 DTD 文件上传到 XMLDB 存储库吗?那将是最简单的解决方案。如果不是,则没有“好的”解决方案,您必须在创建 XMLTYPE 之前摆脱 DTD 引用:

   extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
于 2009-03-12T14:31:40.713 回答