繁体   English   中英

XQuery语法错误

[英]XQuery syntax error

在Oracle 11gR2上,我需要检索XML文件的一部分并创建一个新文件:

SELECT XMLQUERY
    ('for $e in /edi_l/trader
    where $e//pod="XX999"
    order by $e
    return <pod>{$e}</pod>'
   passing MY_T.XML_FILE
returning content
)
FROM MYTABLE MY_T;

输出:

<pod><trader cdisp="AB1111">
<idimpp num="1234">
<hdr>
<odn>567</odn>
<pod>XX999</pod>
</hdr>
...
</idimpp>
</trader>
</pod>

如果我省略标签

<pod></pod>
SELECT XMLQUERY
    ('for $e in /edi_l/trader
    where $e//pod="XX999"
    order by $e
    return {$e}
   passing MY_T.XML_FILE
returning content
)
FROM MYTABLE MY_T;

我收到错误消息:

ORA-19114: XPST0003
LPX-00801: XQuery syntax error at '{'
4       return {$e}
-              ^
19114. 00000 -  "XPST0003 - error during parsing the XQuery expression: %s"
*Cause:    An error occurred during the parsing of the XQuery expression.
*Action:   Check the detailed error message for the possible causes.
Error at Line: 30 Column: 6

为什么?

我需要检索数据而不创建新的外部标签。

如果不将花括号嵌入到自己的节点中,则不需要花括号:

with mytable (xml_file) as (
  select xmltype('<pod><trader cdisp="AB1111">
<idimpp num="1234">
<hdr>
<odn>567</odn>
<pod>XX999</pod>
</hdr>
</idimpp>
</trader>
</pod>')
  from dual
)
SELECT XMLQUERY
  ('for $e in //trader
    where $e//pod="XX999"
    order by $e
    return $e'
  passing MY_T.XML_FILE
  returning content
)
FROM MYTABLE MY_T;

XMLQUERY('FOR$EIN//TRADERWHERE$E//POD="XX999"ORDERBY$ERETURN$E'PASSINGMY_T.XML_FILERETURNINGCONTENT)
--------------------------------------------------------------------------------
<trader cdisp="AB1111"><idimpp num="1234"><hdr><odn>567</odn><pod>XX999</pod></hdr></idimpp></trader>

从有关XQuery表达式的文档中:

计算(动态)构造 –您可以在运行时使用计算值构造XML数据。 例如,以下XQuery表达式构造此XML数据: <foo toto="5"><bar>tata titi</bar> why? </foo> <foo toto="5"><bar>tata titi</bar> why? </foo>

 <foo>attribute toto {2+3}, element bar {"tata", "titi"}, text {" why? "}</foo> 

在这个例子中,元素foo是直接构造; 计算其他构造。 实际上,计算构造函数的参数不是文字(例如toto"tata" ),而是要求值的表达式(例如2+3 )。 元素或属性构造函数的名称和值参数都可以计算。 大括号( {} )用于标记要评估的XQuery表达式。

在您的第一个查询pod是直接构造并计算${e} ,因此必须使用花括号。 在第二个版本中,您直接在任何构造之外引用$e ,因此没有评估,因此不需要(或允许)花括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM