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