我在查询的选择部分使用以下语句:
extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
如果doc.payload
包含XML
没有DTD
声明,则效果很好,但是当Oracle尝试验证文档但找不到DTD
声明时会引发错误DTD
。
如何禁用此查询的XML
验证?我不想在这个问题上影响我的会话设置或全局系统设置。
答案 0 :(得分: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')