Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle XMLQuery传递参数值_Sql_Xml_Oracle - Fatal编程技术网

Sql Oracle XMLQuery传递参数值

Sql Oracle XMLQuery传递参数值,sql,xml,oracle,Sql,Xml,Oracle,在我的XMLQuery中需要帮助 获取循环序列 SELECT extractvalue(update_xmldoc, 'count(/invoice/AR_ITEMS/ITEMS[NAME="Voice" and ITEM_TOTAL!=0])') INTO item_check FROM xml_billrun_files WHERE seq_id = seq AND docname = REPLACE(fn,'.','_HULK.') ORDER BY

在我的XMLQuery中需要帮助

获取循环序列

SELECT extractvalue(update_xmldoc, 'count(/invoice/AR_ITEMS/ITEMS[NAME="Voice" and ITEM_TOTAL!=0])')
    INTO item_check
    FROM xml_billrun_files
    WHERE seq_id = seq
    AND docname  = REPLACE(fn,'.','_HULK.')
  ORDER BY TIMESTAMP DESC;
然后项检查值将传递给循环

FOR lp IN 1..item_check LOOP
      SELECT tst, bill_info_id, bill_no, dur_net_amt, dur_vat_amt, dur_pro_net_amt, dur_pro_vat_amt, sys_descr
      INTO xmlU, bp, bill, net_amt1, vat_amt1, net_amt2, vat_amt2, disc_name
      FROM
        (SELECT row_number() over (partition BY t.docname order by t.timestamp DESC) rn,
          t.docname,
          XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS['||lp||']/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                    where $i = "Plan499 Corp Disc" 
                    or $i = "Plan899 Corp Disc" 
                    or $i = "Plan1099 Corp Disc" 
                    or $i = "Plan1599 Corp Disc"
                    return $i' passing original_xmldoc returning content ).getStringVal() sys_descr
我只是发布了我的脚本的一部分

DECLARE
item_check NUMBER;
fn VARCHAR2(100) := 'test.xml';
seq NUMBER := 1;
BEGIN

SELECT extractvalue(update_xmldoc, 'count(/invoice/AR_ITEMS/ITEMS[NAME="Voice" and ITEM_TOTAL!=0])')
    INTO item_check
    FROM xml_billrun_files
    WHERE seq_id = seq
    AND docname  = REPLACE(fn,'.','_HULK.')
    ORDER BY TIMESTAMP DESC;

    IF item_check <> 0 THEN
    FOR lp IN 1..item_check LOOP
      SELECT tst
      INTO xmlU
      FROM
        (SELECT row_number() over (partition BY t.docname order by t.timestamp DESC) rn,
          t.docname,
          XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS['||lp||']/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                    where $i = "Plan499 Corp Disc" 
                    or $i = "Plan899 Corp Disc" 
                    or $i = "Plan1099 Corp Disc" 
                    or $i = "Plan1599 Corp Disc"
                    return $i' passing original_xmldoc returning content ).getStringVal() sys_descr,
          SUM(SUBSTR(x.chrg_duration,1,instr(x.chrg_duration,':',1)-1)) over (partition BY t.docname) chrg_duration,
          CASE
            WHEN extractvalue(xmltype('<DISCOUNT_INFO>'||XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                              where $i = "Plan499 Corp Disc" 
                              or $i = "Plan899 Corp Disc" 
                              or $i = "Plan1099 Corp Disc" 
                              or $i = "Plan1599 Corp Disc"
                              return $i' passing original_xmldoc returning content )||'</DISCOUNT_INFO>'),'DISCOUNT_INFO') = 'Plan499 Corp Disc' AND SUM(SUBSTR(x.chrg_duration,1,instr(x.chrg_duration,':',1)-1)) over (partition BY t.docname) <= prorate_mins
            THEN insertchildxml(
                  insertchildxml(
                    updatexml(
                      updatexml(
                        updatexml(t.update_xmldoc,'/invoice/BILLINFO/TOTAL_DUE/text()', 
                        extractvalue(t.update_xmldoc,'/invoice/BILLINFO/TOTAL_DUE') - SUM(x.amount) over (partition BY t.docname)),'/invoice/BILLINFO/CURRENT_TOTAL/text()', 
                      extractvalue(t.update_xmldoc,'/invoice/BILLINFO/CURRENT_TOTAL') - (SUM(x.amount) over (partition BY t.docname))),'/invoice/BILLINFO/DISCOUNT_VALUE', 
                    xmltype('<DISCOUNT_VALUE>'||(NVL(extractvalue(t.update_xmldoc,'/invoice/BILLINFO/DISCOUNT_VALUE'),0) - ROUND((SUM(x.amount) over (partition BY t.docname))/1.12,2))||'</DISCOUNT_VALUE>')), '/invoice/AR_ITEMS/ITEMS[NAME="Voice"]/USAGE_RECORDS[STREAM_NAME="NDD"]', 'DURATION_NET_DISCOUNT', 
                xmlelement("DURATION_NET_DISCOUNT", ROUND((SUM(x.amount) over (partition BY t.docname)*-1)/1.12,2))),'/invoice/AR_ITEMS/ITEMS[NAME="Voice"]/USAGE_RECORDS[STREAM_NAME="NDD"]','DURATION_VAT_DISCOUNT',
              xmlelement("DURATION_VAT_DISCOUNT",ROUND(((SUM(x.amount) over (partition BY t.docname)*-1)/1.12)*.12,2)))
              END tst
          FROM xml_billrun_files t ,
          xmltable('/invoice/AR_ITEMS/ITEMS/USAGE_RECORDS/SESSION_INFO' 
                    passing t.update_xmldoc 
                    columns chrg_duration VARCHAR2(20) path 'DURATION', 
                            amount NUMBER path 'AMOUNT') x
        WHERE seq_id  = seq
        AND t.docname = REPLACE(fn,'.','_HULK.')
        )
      WHERE rn = 1;
      UPDATE xml_billrun_files a
      SET update_xmldoc = xmlU
      WHERE seq_id      = seq
      AND docname       = REPLACE(fn,'.','_HULK.');
      COMMIT;
    END LOOP;
    END IF;
END;
脚本很好,但是当我在XMLQuery中传递lp的值时,我得到了错误

错误(528,66):PL/SQL:ORA-19109:应返回关键字

好的,下面是我脚本的一个例子

DECLARE
item_check NUMBER;
fn VARCHAR2(100) := 'test.xml';
seq NUMBER := 1;
BEGIN

SELECT extractvalue(update_xmldoc, 'count(/invoice/AR_ITEMS/ITEMS[NAME="Voice" and ITEM_TOTAL!=0])')
    INTO item_check
    FROM xml_billrun_files
    WHERE seq_id = seq
    AND docname  = REPLACE(fn,'.','_HULK.')
    ORDER BY TIMESTAMP DESC;

    IF item_check <> 0 THEN
    FOR lp IN 1..item_check LOOP
      SELECT tst
      INTO xmlU
      FROM
        (SELECT row_number() over (partition BY t.docname order by t.timestamp DESC) rn,
          t.docname,
          XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS['||lp||']/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                    where $i = "Plan499 Corp Disc" 
                    or $i = "Plan899 Corp Disc" 
                    or $i = "Plan1099 Corp Disc" 
                    or $i = "Plan1599 Corp Disc"
                    return $i' passing original_xmldoc returning content ).getStringVal() sys_descr,
          SUM(SUBSTR(x.chrg_duration,1,instr(x.chrg_duration,':',1)-1)) over (partition BY t.docname) chrg_duration,
          CASE
            WHEN extractvalue(xmltype('<DISCOUNT_INFO>'||XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                              where $i = "Plan499 Corp Disc" 
                              or $i = "Plan899 Corp Disc" 
                              or $i = "Plan1099 Corp Disc" 
                              or $i = "Plan1599 Corp Disc"
                              return $i' passing original_xmldoc returning content )||'</DISCOUNT_INFO>'),'DISCOUNT_INFO') = 'Plan499 Corp Disc' AND SUM(SUBSTR(x.chrg_duration,1,instr(x.chrg_duration,':',1)-1)) over (partition BY t.docname) <= prorate_mins
            THEN insertchildxml(
                  insertchildxml(
                    updatexml(
                      updatexml(
                        updatexml(t.update_xmldoc,'/invoice/BILLINFO/TOTAL_DUE/text()', 
                        extractvalue(t.update_xmldoc,'/invoice/BILLINFO/TOTAL_DUE') - SUM(x.amount) over (partition BY t.docname)),'/invoice/BILLINFO/CURRENT_TOTAL/text()', 
                      extractvalue(t.update_xmldoc,'/invoice/BILLINFO/CURRENT_TOTAL') - (SUM(x.amount) over (partition BY t.docname))),'/invoice/BILLINFO/DISCOUNT_VALUE', 
                    xmltype('<DISCOUNT_VALUE>'||(NVL(extractvalue(t.update_xmldoc,'/invoice/BILLINFO/DISCOUNT_VALUE'),0) - ROUND((SUM(x.amount) over (partition BY t.docname))/1.12,2))||'</DISCOUNT_VALUE>')), '/invoice/AR_ITEMS/ITEMS[NAME="Voice"]/USAGE_RECORDS[STREAM_NAME="NDD"]', 'DURATION_NET_DISCOUNT', 
                xmlelement("DURATION_NET_DISCOUNT", ROUND((SUM(x.amount) over (partition BY t.docname)*-1)/1.12,2))),'/invoice/AR_ITEMS/ITEMS[NAME="Voice"]/USAGE_RECORDS[STREAM_NAME="NDD"]','DURATION_VAT_DISCOUNT',
              xmlelement("DURATION_VAT_DISCOUNT",ROUND(((SUM(x.amount) over (partition BY t.docname)*-1)/1.12)*.12,2)))
              END tst
          FROM xml_billrun_files t ,
          xmltable('/invoice/AR_ITEMS/ITEMS/USAGE_RECORDS/SESSION_INFO' 
                    passing t.update_xmldoc 
                    columns chrg_duration VARCHAR2(20) path 'DURATION', 
                            amount NUMBER path 'AMOUNT') x
        WHERE seq_id  = seq
        AND t.docname = REPLACE(fn,'.','_HULK.')
        )
      WHERE rn = 1;
      UPDATE xml_billrun_files a
      SET update_xmldoc = xmlU
      WHERE seq_id      = seq
      AND docname       = REPLACE(fn,'.','_HULK.');
      COMMIT;
    END LOOP;
    END IF;
END;
声明
项目检查编号;
fn VARCHAR2(100):=“test.xml”;
序号:=1;
开始
选择提取值(更新_xmldoc,'count(/invoice/AR_ITEMS/ITEMS[NAME=“Voice”和ITEM_TOTAL!=0]))
进入项目检查
从xml\u billrun\u文件
其中,seq_id=seq
和docname=REPLACE(fn,“,”绿巨人“)
按时间戳顺序描述;
如果项目检查为0,则
对于1.项目检查循环中的lp
选择tst
进入xmlU
从…起
(选择(按t.docname按t.timestamp DESC按顺序划分)rn上的行号(),
t、 文件名,
XMLQuery($i的不同值(/invoice/AR|u ITEMS[''|lp||']]/ITEMS/EVENTS/BAL|u impact/DISCOUNT|u INFO)
其中$i=“Plan499公司光盘”
或$i=“Plan899公司光盘”
或$i=“Plan1099公司光盘”
或$i=“Plan1599公司光盘”
返回$i'传递原始内容(返回内容)。getStringVal()sys\u descr,
在(按t.docname划分的)chrg_持续时间上求和(SUBSTR(x.chrg_持续时间,1,instr(x.chrg_持续时间,,:',1)-1),
案例
提取价值时(xmltype(“”| | XMLQuery($i)的不同值(/invoice/AR_ITEMS/ITEMS/EVENTS/BAL_impact/DISCOUNT_INFO)
其中$i=“Plan499公司光盘”
或$i=“Plan899公司光盘”
或$i=“Plan1099公司光盘”
或$i=“Plan1599公司光盘”

返回$i‘传递原始的_xmldoc返回内容)|‘’、‘折扣信息’=‘Plan499公司光盘’和SUM(SUBSTR(x.chrg_duration,1,instr(x.chrg_duration,:’,1)-1)(按t.docname分区)问题是XPath中的字符串连接。它不喜欢你做
…AR_ITEMS[''lp | | |']/ITEMS…

您可以通过
passing
子句将PL/SQL
lp
变量的值传入,该子句允许多个逗号分隔的参数;为它指定一个标识符,然后直接在XPath中引用它。我一直使用
lp
$lp
;它们不必匹配PL/SQL变量名,但如果匹配,可能会更清楚

      XMLQuery('for $i in distinct-values(/invoice/AR_ITEMS[$lp]/ITEMS/EVENTS/BAL_IMPACTS/DISCOUNT_INFO)
                where $i = "Plan499 Corp Disc" 
                or $i = "Plan899 Corp Disc" 
                or $i = "Plan1099 Corp Disc" 
                or $i = "Plan1599 Corp Disc"
                return $i' passing original_xmldoc, cast(lp as number) as "lp" returning content ).getStringVal() sys_descr,

PL/SQL循环索引变量
lp
是一个
pls_integer
,passing子句不喜欢它;如果你直接传递它,你会得到ORA-00932,因此你需要将它转换为数字数据类型。

如果你不分享整个内容,那么任何人都很难帮助你。理想情况下,你应该给出一个小的工作示例,而不是hat单独演示了这个问题,我们不需要了解域。完成后,我更新了我的问题:)我这样做了,在传递FOR语句中得到的lp值时,它返回
错误(535,57):PL/SQL:ORA-00932:不一致的数据类型:预期-获得本机整数
@NelzKi-我添加了
xmltype(lp)
打电话。您能在问题中添加一个示例XML文档吗?用一些数据进行测试会更容易。也可能会建议您正在使用的不推荐使用的函数的替代方案;现在实际使用该值。