LPX-00209:以 XML 开头的 PI 名称已保留,XMLTYPE.transform

LPX-00209: PI names starting with XML are reserved, XMLTYPE.transform

当我们最近将数据库系统从 Oracle llg 升级到 12c 时,我们开始遇到 LPX-00209 问题。我正在尝试找到解决我现在收到错误的原因。

我发现下面可能是什么问题。我们迁移到 Oracle 12c,发现 l_xml.transform(XMLTYPE (l_xslt)) 在更高版本的 Oracle 中不再有效。下面是我的程序,尝试使用 XSL 样式 sheet 转换 XML。我可以使用另一个函数来代替 l_xml.transform(XMLTYPE (l_xslt))。一旦它转换了 XML,它就会将它传回并尝试使用 p_resulting_xml.getclobval() 将这个 XMl 放入一个 clob 中并传递给过程 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

确保您生成的 XML 不超过一个 XML 声明(<?xml version="1.0" encoding="utf-8"?>),如果有的话,它只出现在XML 文档。您的错误消息听起来好像遇到了第二个 XML 声明并且被解释为 PI。

除非您从 Oracle 获得补丁,否则 l_xml.transform 在更高版本的 oracle(即 12c)中不起作用。

解决方法如下。您可以将其作为立即执行语句放在 PL/SQL 中或 SQL 中靠近错误发生的位置。

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

谢谢肖恩