ORA-31061: Ошибка XDB: не удалось преобразовать специальный символ в экранированный символ.
Я совершенно новичок в Oracle XDB, пытаюсь исправить код в производственной среде, в которой я совершенно новичок.
SELECT DBMS_LOB.SubStr(RTRIM (XMLAGG (XMLELEMENT (E,XMLATTRIBUTES (ntx.nttx_str || '|' AS "Seg")) ORDER BY ntx.ref_id, ntx.ntnb_input_dtm desc)
.EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg').GetClobVal(),','),1000,1)
FROM
(SELECT umum.ref_id,
ntnb.ntnb_input_dtm,
DBMS_LOB.SubStr(RTRIM (XMLAGG (XMLELEMENT (E,XMLATTRIBUTES (nttx.nttx_text || '' AS "Seg")) ORDER BY nttx.nttx_seq_no asc)
.EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg').GetClobVal(),','),500,1) AS nttx_str
FROM umum_util_mgt umum,
ntnb_note_base ntnb,
nttx_note_text nttx
WHERE ntnb.ntnb_id = umum.ntnb_id
AND ntnb.ntnb_id = nttx.ntnb_id
AND ntnb.ntnb_input_dtm = nttx.ntnb_input_dtm
GROUP BY umum.ref_id, ntnb.ntnb_input_dtm
) ntx,
php_mdx_auth_ext_tbl paex
WHERE ntx.ref_id = paex.ref_id*
Когда я пытаюсь выполнить вышеуказанный запрос, Oracle возвращает следующую ошибку
ORA-31061: Ошибка XDB: сбой преобразования специального символа в экранированный.
Раньше это работало в более старой версии Oracle, после перехода на Oracle 12c мы столкнулись с этой проблемой.
1 ответ
Решение
Эта ошибка обычно возникает, когда в данных XML присутствует управляющий символ (неверные данные).
Я могу воспроизвести ошибку с неверными данными XML, но да, код ошибки другой, я не уверен, почему.
SQL> WITH DATAA AS ( 2 SELECT UNISTR('SO\0013bad') TEST FROM DUAL 3 UNION ALL 4 SELECT UNISTR('SO\00aegood') TEST FROM DUAL 5 ) 6 SELECT xmlelement("a", test) AS TEST 7 FROM DATAA; ERROR: ORA-64451: Conversion of special character to escaped character failed.
Чтобы устранить эту ошибку,
- Вам необходимо найти записи с неверными данными XML и исправить эти данные. Ты можешь использовать
REGEXP_LIKE
как показано ниже, чтобы найти неверные данные XML и исправить эти данные:
SQL> WITH DATAA AS ( 2 SELECT UNISTR('SO\0013bad') TEST FROM DUAL 3 UNION ALL 4 SELECT UNISTR('SO\00aegood') TEST FROM DUAL 5 ) 6 SELECT * 7 FROM DATAA 8 WHERE REGEXP_LIKE ( TEST, '[[:cntrl:]]' ); TEST ------- SObad SQL>
-- ИЛИ --
- Ты можешь использовать
REGEXP_REPLACE
чтобы пропустить управляющие символы, содержащиеся в данных XML, из обработки следующим образом:
SQL> WITH DATAA AS ( 2 SELECT UNISTR('SO\0013bad') TEST FROM DUAL 3 UNION ALL 4 SELECT UNISTR('SO\00aegood') TEST FROM DUAL 5 ) 6 SELECT xmlelement("a", REGEXP_REPLACE(TEST, '[[:cntrl:]]', '')) AS TEST 7 FROM DATAA; TEST -------------------------------------------------------------------------------- <a>SObad</a> <a>SO«good</a> SQL>
Ура!!