Oracle xml错误
在Oracle 11gr2上,我在表中导入了一个xml文件:Oracle xml错误,xml,oracle,Xml,Oracle,在Oracle 11gr2上,我在表中导入了一个xml文件: INSERT INTO MS386_XML_TEMPLATE VALUES (SYSDATE, pvNomeFile, xmltype(bfilename(myDirectory, pvNomeFile), nls_charset_id('UTF8'))); 当我在此表上选择时,出现以下错误: SELECT TBELENCOPOD.POD FROM ( SELECT XMLCast(TBPOD.COLUMN_VALUE AS
INSERT INTO MS386_XML_TEMPLATE
VALUES (SYSDATE, pvNomeFile,
xmltype(bfilename(myDirectory, pvNomeFile), nls_charset_id('UTF8')));
当我在此表上选择时,出现以下错误:
SELECT TBELENCOPOD.POD
FROM
(
SELECT
XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
FROM table(
XMLSequence(
XMLTYPE(Cursor(SELECT * FROM MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif idrich/hdr/pod')
)
) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
TBELENCOPOD.POD=TBPOD.POD
WHERE
TBPOD.POD IS NULL
GROUP BY
TBELENCOPOD.POD;
ORA-31011: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00204: syntax error
Error at line 7
ORA-06512: a "SYS.XMLTYPE", line 343
ORA-06512: a line 1
31011. 00000 - "XML parsing failed"
*Cause: XML parser returned an error while trying to parse the document.
*Action: Check if the document to be parsed is valid.
xml是有效的,我已经用验证器检查过了。
非常感谢,伊戈尔 @鲍勃·贾维斯:谢谢;以下是一些文件行:
<?xml version = '1.0' encoding = 'UTF-8'?><!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">
<edi_l>
<trader cdisp="DP1901">
<idrif idrich="1512543258">
<hdr>
<odn>915000591962</odn>
<pod>IT001E08654958</pod>
<presa>027292224</presa>
<cf>MNNMHL78H67L669B</cf>
<piva/>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm/>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
<idrif idrich="1512540815">
....
915000591962
IT001E08654958
027292224
MNNMHL78H67L669B
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
....
@博奈斯特@Alex Poole:谢谢你的回复;我是Oracle XML数据库的新手,我知道我正在做很多事情或犯很多错误!
我粘贴了一个正在处理的xml文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
<odn>915000591962</odn>
<pod>IT111111111111</pod>
<presa>027292224</presa>
<cf>AAAAAAAAAAAAAAA</cf>
<piva></piva>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm></udm>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
<idrif idrich="2222222222">
<hdr>
<odn>915000591962</odn>
<pod>IT222222222222</pod>
<presa>027290063</presa>
<cf>BBBBBBBBBBBBBBBBB</cf>
<piva></piva>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm></udm>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>
915000591962
IT111111111
027292224
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
915000591962
它是2222222
027290063
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
如果数据库中不存在“pod”,我想获取它的所有数据,并创建一个新的有效xml文件(未找到每个pod一个)。例如,假设没有找到pod IT111111;Oracle必须生成以下文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
<odn>915000591962</odn>
<pod>IT111111111111</pod>
<presa>027292224</presa>
<cf>AAAAAAAAAAAAAAA</cf>
<piva></piva>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm></udm>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>
915000591962
IT111111111
027292224
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
谢谢,
Igor这一功能有效(同样适用于原始文件中的dtd-->特别感谢Marco Gralike):
但是为什么,如果我从文件中删除该行:
<!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">
要忽略dtd:这样,表中的文件加载工作正常,但原始查询不起作用:
SELECT TBELENCOPOD.POD
FROM
(
SELECT
XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
FROM table(
XMLSequence(
XMLTYPE(Cursor(SELECT * FROM MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif idrich/hdr/pod')
)
) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
TBELENCOPOD.POD=TBPOD.POD
WHERE
TBPOD.POD IS NULL
GROUP BY
TBELENCOPOD.POD;
谢谢,Igor这一功能有效(同样适用于原始文件中的dtd-->特别感谢Marco Gralike): 但是为什么,如果我从文件中删除该行:
<!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">
要忽略dtd:这样,表中的文件加载工作正常,但原始查询不起作用:
SELECT TBELENCOPOD.POD
FROM
(
SELECT
XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
FROM table(
XMLSequence(
XMLTYPE(Cursor(SELECT * FROM MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif idrich/hdr/pod')
)
) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
TBELENCOPOD.POD=TBPOD.POD
WHERE
TBPOD.POD IS NULL
GROUP BY
TBELENCOPOD.POD;
谢谢,Igor请编辑您的问题并包括XML文件的前15行。谢谢。您能提供一个完整的xml文档来生成输出以及您希望返回的输出吗?我猜XMLTABLE()将是解决方案的一部分,但如果没有我所要求的两部分信息,就很难提供帮助。除了提取路径中的空格之外,您所显示的内容似乎有效,它得到的是“LPX-00601:Invalid token”,而不是语法错误。正在加载的XML必须有效,否则插入时会出错。如前所述,请发布一个生成您看到的错误的最小完整XML文档,以及您正在使用的实际提取路径。然而,由于extract和XMLSequence已被弃用,所以您要用一种复杂的方法来实现这一点。看起来您确实应该使用XMLTable;但是,在不清楚是什么原因导致了您看到的错误的情况下,不确定这是否足以避免它。仅供参考,如果您在问题测试中仅在评论中提到我们,我们不会收到通知。我仍然没有从您添加的示例XML中得到错误;在11.2.0.3或11.2.0.4中;也许你在较早的补丁级别?(唯一的区别是我没有您的DTD,所以我将从XML中删除它)。实际上,您希望删除
idrif
节点,其pod
值存在于另一个表中,对吗?如果一个文档最终没有节点-留下一个空的交易者节点,或者根本没有文档怎么办?@AlexPoole-Alex感谢您的回复;是的,你是对的:我删除了该行:并且没有生成错误;那么,我如何在原始文件中保留这一行呢?我执行语句execute IMMEDIATE('alter session set events=''31156 trace name context FORWARE,level 2'');在Oracle软件包的开始,但似乎没有任何变化。谢谢,Igor。请编辑您的问题并包括XML文件的前15行。谢谢。您能提供一个完整的xml文档来生成输出以及您希望返回的输出吗?我猜XMLTABLE()将是解决方案的一部分,但如果没有我所要求的两部分信息,就很难提供帮助。除了提取路径中的空格之外,您所显示的内容似乎有效,它得到的是“LPX-00601:Invalid token”,而不是语法错误。正在加载的XML必须有效,否则插入时会出错。如前所述,请发布一个生成您看到的错误的最小完整XML文档,以及您正在使用的实际提取路径。然而,由于extract和XMLSequence已被弃用,所以您要用一种复杂的方法来实现这一点。看起来您确实应该使用XMLTable;但是,在不清楚是什么原因导致了您看到的错误的情况下,不确定这是否足以避免它。仅供参考,如果您在问题测试中仅在评论中提到我们,我们不会收到通知。我仍然没有从您添加的示例XML中得到错误;在11.2.0.3或11.2.0.4中;也许你在较早的补丁级别?(唯一的区别是我没有您的DTD,所以我将从XML中删除它)。实际上,您希望删除idrif
节点,其pod
值存在于另一个表中,对吗?如果一个文档最终没有节点-留下一个空的交易者节点,或者根本没有文档怎么办?@AlexPoole-Alex感谢您的回复;是的,你是对的:我删除了该行:并且没有生成错误;那么,我如何在原始文件中保留这一行呢?我执行语句execute IMMEDIATE('alter session set events=''31156 trace name context FORWARE,level 2'');在Oracle软件包的开头