Как отключить проверку XML DTD в БД Oracle? - PullRequest
2 голосов
/ 12 марта 2009

Я использую следующее утверждение в выбранной части запроса:

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

работает хорошо, если doc.payload содержит XML без объявления DTD, но выдает ошибку, когда присутствует объявление DTD, когда Oracle пытается проверить документ, но не может найти DTD.

Как отключить проверку XML для этого запроса? Я не хочу влиять на настройки моего сеанса или глобальные настройки системы в этом вопросе.

1 Ответ

4 голосов
/ 12 марта 2009

Вы можете отключить проверку при создании 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? Это было бы самым простым решением. Если нет, то «хорошего» решения не существует, вы должны избавиться от ссылки DTD перед созданием XMLTYPE:

   extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
...