2016-02-26 3 views
1

Нужна помощь в моем XMLQuery.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 TIMESTAMP DESC; 

затем item_check значение будет проходить в петлю

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 

я просто оставить часть моего сценария.

сценарий хорош, но когда я передать значение ЛВ внутри XMLQuery я получаю ошибку

Ошибка (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; 
+0

Если вы не разделяете все это, вам будет сложно помочь кому-либо. В идеале вы должны представить небольшой пример, который демонстрирует проблему изолированно, без необходимости понимать домен. – ninesided

+0

done, я обновил свой вопрос :) – NelzKi

ответ

0

Проблема заключается в конкатенации строк в XPath. Вам не нравится ... AR_ITEMS['||lp||']/ITEMS ....

Вы можете передать значение вашей переменной PL/SQL lp через предложение passing, которое допускает несколько разделенных запятыми аргументов; дать ему идентификатор, а затем обратиться к нему непосредственно в 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, 

Параметр/индекс цикла SQL-PL переменная lp является pls_integer, который проходной пункт не нравится; если вы передадите это напрямую, вы получите ORA-00932, поэтому вам нужно указать его на тип данных числа.

+0

Я сделал это, передав значение lp, которое я получаю в операторе FOR, он возвращает 'Error (535,57): PL/SQL: ORA-00932: непоследовательные типы данных: ожидается - получил NATIVE INTEGER' – NelzKi

+0

@NelzKi - я добавил вызов 'xmltype (lp)'. Можете ли вы добавить образец XML-документа к вопросу? С некоторыми данными было бы легче протестировать. Возможно, тогда также можно предложить альтернативы устаревшим функциям, которые вы используете. –

+0

С некоторыми составленными данными, которые, похоже, работают. –

Смежные вопросы