Как зациклить и вернуть значения XML с несколькими одинаковыми тегами? - PullRequest
0 голосов
/ 06 мая 2019

Мне нужно вернуть значения Fund_code в следующем XML.Есть два Fund / Fund_code, и мой запрос дает мне ошибку (учитывая, что XPath указывает на более чем один узел), и я не знаю, как обойти это.

<ROWSET>
    <Fund>
        <Fund_code>F22</Fund_code>
    </Fund>
    <Fund>
        <Fund_code>F02</Fund_code>
    </Fund>
</ROWSET>

Я попытался перебратьЭлементы XML, но это не позволило бы мне.

FOR I IN 1..2
  loop
  SELECT COUNT(EXTRACTVALUE(V_XML, '//Fund/Fund_code'))
  INTO V_fund_code
  FROM DUAL;
  DBMS_OUTPUT.PUT_LINE('GRANT_COUNT|'||V_fund_code);
  end loop;
END;

Это дает мне эту ошибку:

ORA-19025: EXTRACTVALUE returns value of only one node
ORA-06512: at line 34
19025. 00000 -  "EXTRACTVALUE returns value of only one node"
*Cause:    Given XPath points to more than one node.
*Action:   Rewrite the query so that exactly one node is returned.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019
BEGIN
  FOR i in (
             SELECT Fund_code
                FROM 
                   xmltable(
                              '//Fund'
                              PASSING XMLTYPE('<ROWSET>
                                                    <Fund>
                                                        <Fund_code>F22</Fund_code>
                                                    </Fund>
                                                    <Fund>
                                                        <Fund_code>F02</Fund_code>
                                                    </Fund>
                                                </ROWSET>')
                             COLUMNS
                                Fund_code varchar2(10) PATH '//*:Fund_code'                      
                                )

                           ) LOOP

               dbms_output.put_line(i.fund_code);

   END LOOP;
END;
0 голосов
/ 06 мая 2019

Нашел решение, используя следующее.

FOR I IN 1..2
  loop
  SELECT COUNT(EXTRACTVALUE(V_XML, '//Fund['||I||']/Fund_code'))
  INTO V_fund_code
  FROM DUAL;
  DBMS_OUTPUT.PUT_LINE('GRANT_COUNT|'||V_fund_code);
  end loop;
END;
...