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';
谢谢肖恩
当我们最近将数据库系统从 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';
谢谢肖恩