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

时间:2018-03-15 15:33:09

标签: xml plsql oracle12c clob xmltype

当我们最近将我们的数据库系统从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

2 个答案:

答案 0 :(得分:0)

确保生成的XML只有一个XML声明(process.exit(0)),如果有的话,它只出现在XML文档的最顶层。您的错误消息听起来好像正在遇到第二个XML声明,并被解释为PI。

答案 1 :(得分:0)

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

谢谢肖恩