【问题标题】:How to pass value in xmltable如何在xmltable中传递值
【发布时间】:2016-02-26 19:59:47
【问题描述】:

如何在 xmltable 的 xpath 中传递变量值?

DECLARE
  v NUMBER := 0;
BEGIN
  SELECT *
  FROM xml_billrun_files t ,
    xmltable('/invoice/AR_ITEMS[@elem='||v||']/ITEMS/USAGE_RECORDS/SESSION_INFO' 
              passing t.update_xmldoc 
              columns chrg_duration VARCHAR2(20) path 'DURATION', 
                      amount NUMBER path 'AMOUNT') x;
END;

这个我试过了。

DECLARE
  v NUMBER := 0;
BEGIN
  SELECT *
  FROM xml_billrun_files t ,
    xmltable('/invoice/AR_ITEMS[@elem=$i]/ITEMS/USAGE_RECORDS/SESSION_INFO' 
              passing t.update_xmldoc, xmltype(v) as "i"
              columns chrg_duration VARCHAR2(20) path 'DURATION', 
                      amount NUMBER path 'AMOUNT') x;
END;

但是它返回一个错误:

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00210: expected '<' instead of '0'
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
ORA-06512: at line 5
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.

感谢您的帮助。

【问题讨论】:

    标签: sql xml oracle


    【解决方案1】:

    my answer 到您之前的问题中,我错误地将xmltype(lp) as "lp" 用于您的 XMLQuery 调用。不知道为什么它没有在那里抱怨,但它实际上并没有限制比赛......

    对于这个 XMLTable 调用,您可以直接传递数字,无需转换/转换,因为它已经是一个数字:

      SELECT chrg_duration, amount
      into ...
      FROM xml_billrun_files t ,
        xmltable('/invoice/AR_ITEMS[@elem=$i]/ITEMS/USAGE_RECORDS/SESSION_INFO' 
                  passing t.update_xmldoc, v as "i"
                  columns chrg_duration VARCHAR2(20) path 'DURATION', 
                          amount NUMBER path 'AMOUNT') x;
    

    如果你在for循环中做,那么索引是错误的数据类型,你需要将它转换为数字:

      SELECT chrg_duration, amount
      into ...
      FROM xml_billrun_files t ,
        xmltable('/invoice/AR_ITEMS[@elem=$i]/ITEMS/USAGE_RECORDS/SESSION_INFO' 
                  passing t.update_xmldoc, cast(v as number) as "i"
                  columns chrg_duration VARCHAR2(20) path 'DURATION', 
                          amount NUMBER path 'AMOUNT') x;
    

    【讨论】:

    • 但是在这样做时,使用 FOR 循环,会得到错误 Error(674,46): PL/SQL: ORA-00932: inconsistent datatypes: expected - got NATIVE INTEGER
    • @NelzKi - 是的,上一个问题的答案是错误的,我已经更正了这两个问题。您需要将循环变量转换为 SQL 数字类型。
    猜你喜欢
    • 2013-09-05
    • 2014-02-21
    • 2019-06-23
    • 2012-09-23
    • 1970-01-01
    • 2018-06-10
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多