ORA-31061: Ошибка XDB: не удалось преобразовать специальный символ в экранированный символ - PullRequest
0 голосов
/ 20 февраля 2020

Я совершенно новичок в XDB Oracle, пытаюсь исправить код в производственной среде, к которой я совершенно новичок.

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 12 c мы столкнулись с этой проблемой.

1 Ответ

1 голос
/ 20 февраля 2020

Эта ошибка обычно возникает, когда в данных 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.

Чтобы устранить эту ошибку,

  1. Вам необходимо найти записи с неверными 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>

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...