Oracle

Oracle Select with xmlquery() error - 如何忽略錯誤?

  • May 29, 2019

在嘗試從 Oracle DB 表中提取數據子集時,其中一列是 XMLType,它是使用**xmlquery()**提取的以獲取相關資訊。

問題在於 XML 數據來自外部來源,這通常會給我們提供帶有未轉義特殊字元的格式錯誤的 XML。

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00244: invalid use of less-than ('<') character (use <)
Error at line 1
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.

我的目的可以忽略這些行。

如何忽略這些解析錯誤並讓 Oracle 繼續執行 SQL 語句?

謝謝

我不認為你可以直接。我不知道有一種方法可以將 XML 解析器置於一種“寬鬆”模式,在這種模式下它會忽略驗證錯誤,並且您無法在純 SQL 中擷取異常。

解決這個問題的一種方法(除了騷擾您的外部源以便它們生成有效的 XML,這是解決方案)將在您儲存 XML 時對其進行驗證,並且僅處理已驗證的數據。您可以編寫簡單的 PL/SQL 程式碼。這是解決此問題的一種方法的最小範例。

範例表和數據:

create table foo(id int, xml clob, valid int default null);
insert into foo(id,xml) values (1, '<?xml version="1.0"?><root><a foo="b"></a></root>');
insert into foo(id,xml) values (2, '<?xml version="1.0"?><root><a foo="<"></a></root>');
commit;

驗證功能:

create function is_valid_xml(xml_param clob)
return int
as
 scratch xmltype;
begin
 select xmltype(xml_param) into scratch from dual;
 return 1;
exception
 when others then
   return 0;
end;
/

應用驗證功能

SQL> update foo set valid = is_valid_xml(xml) where valid is null;
2 rows updated.

SQL> select id, valid from foo;
ID | VALID
----------
1 |     1
2 |     0

然後,您可以根據您的常用標準和valid列進行查詢/報告。

引用自:https://dba.stackexchange.com/questions/44120