【问题标题】:LPX-00209: PI names starting with XML are reserved, XMLTYPE.transformLPX-00209:保留以 XML 开头的 PI 名称,XMLTYPE.transform
【发布时间】:2018-08-24 12:02:41
【问题描述】:

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

我发现了下面的问题。我们迁移到 Oracle 12c,发现 l_xml.transform(XMLTYPE (l_xslt)) 在更高版本的 Oracle 中不再有效。下面是我的过程,尝试使用 XSL 样式表转换 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 plsql oracle12c clob xmltype


    【解决方案1】:

    除非您从 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'; 
    

    谢谢肖恩

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我明白,但首先我需要查看 XML 以查看是否是这种情况,因此我需要将其转换为 varchar2,以便我可以输出 XML 以查看它。
      • 将其视为文本,而不是 XML,直到您可以解决此问题(因为如果格式不正确,则不是 XML)。
      猜你喜欢
      • 2021-06-16
      • 2017-03-18
      • 2017-06-01
      • 2022-11-17
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多