LPX-00209: Имена PI, начинающиеся с XML, зарезервированы, XMLTYPE.transform

Мы начали сталкиваться с проблемой LPX-00209, когда недавно обновили нашу систему баз данных с Oracle llg до 12c. Я пытаюсь найти решение, почему я сейчас получаю сообщение об ошибке.

Я нашел, что может быть проблема ниже. Мы перешли на Oracle 12c и обнаружили, что l_xml.transform(XMLTYPE (l_xslt)) больше не работает в более поздних версиях Oracle. Ниже моя процедура, пытающаяся преобразовать XML с помощью таблицы стилей XSL. Есть ли другая функция, которую я могу использовать вместо l_xml.transform(XMLTYPE (l_xslt)). После преобразования XML он передает его обратно и пытается затем поместить этот XML в clob с помощью p_resulting_xml.getclobval() и передать в процедуру write_file_email.

Ниже приведена документация поддержки Oracle, объясняющая проблему.

https://support.oracle.com/knowledge/Oracle%20Database%20Products/1642080_1.html

PROCEDURE end_workbook(p_report_clob  IN OUT    CLOB,
                       p_xml          IN OUT XMLTYPE)
IS
  l_xslt         CLOB;
  l_xml          XMLTYPE;
BEGIN

  Dbms_Lob.Writeappend(p_report_clob, 13, '</WORKSHEETS>');

  l_xml := XMLTYPE(p_report_clob,NULL,0,1);
  Dbms_Lob.Freetemporary (p_report_clob);

  l_xslt := load_file('EXT_XSL_IN_DIR', 'ndu_sfich_report.xsl');
  p_xml := l_xml.transform(XMLTYPE (l_xslt));

END end_workbook;



PROCEDURE write_file_email(p_filename    IN VARCHAR2
                          ,p_resulting_xml             IN XMLTYPE
                          ,p_first_visible_worksheet   IN PLS_INTEGER DEFAULT 0)
  IS 

  BEGIN    

    write_file (p_dir                     => pb_gen_report_dir  -- VARCHAR2
               ,p_filename                => p_filename         -- VARCHAR2
               ,p_file                    => p_resulting_xml.getclobval() -- CLOB
               ,p_openmode                => 'W' -- VARCHAR2
               ,p_first_visible_worksheet => p_first_visible_worksheet);  --PLS_INTEGER

Сообщение об ошибке ниже

15:02:40 Error: ORA-31011: XML parsing failed 
ORA-19213: error occurred in XML processing at lines 1 
LPX-00209: PI names starting with XML are reserved 
ORA-06512: at "SYS.XMLTYPE", line 138 
ORA-06512: at "PRBLK.NDU_REPORTING", line 330 
ORA-06512: at "PRBLK.NDU_SFICH_REPORTING", line 1299 ORA-06512: at line 1

person Shaun Kinnair    schedule 15.03.2018    source источник


Ответы (2)


Убедитесь, что ваш сгенерированный XML содержит не более одного XML-объявления (<?xml version="1.0" encoding="utf-8"?>), а если оно есть, то оно отображается только в самом верху XML-документа. Ваше сообщение об ошибке звучит так, как будто встречается второе объявление XML, которое интерпретируется как PI.

person kjhughes    schedule 15.03.2018
comment
Я понимаю это, но прежде всего мне нужно просмотреть XML, чтобы убедиться, что это так, поэтому мне нужно преобразовать его в varchar2, чтобы я мог вывести XML для его просмотра. - person Shaun Kinnair; 15.03.2018
comment
Рассматривайте его как текст, а не XML, пока не решите эту проблему (потому что это не XML, если он неправильно сформирован). - person kjhughes; 15.03.2018

l_xml.transform не работает в более поздних версиях Oracle (например, 12c), если вы не получите патч от Oracle.

Работа вокруг ниже. Вы можете поместить это как оператор немедленного выполнения в PL/SQL или в SQL рядом с местом возникновения ошибки.

ALTER SESSION SET sql_trace = true;
ALTER SESSION SET EVENTS='31151 trace name context forever, level 0x40000'; 

спасибо Шон

person Shaun Kinnair    schedule 19.03.2018