遍历存储过程中的 Xmltype

Loop through Xmltype in stored proc

我正在尝试 parse/loop 通过简单的 xml 来捕获单个值,并在将来用它做一些事情。

此代码有效...有点 - 请参阅代码内注释

Declare 
    /* 2-item xml */
    x nvarchar2(1000) := '<values><value>1,"rrr|</value><value>2</value></values>';
    xt XmlType;
    /* expect c = 2 in the end */
    c number := 0;
Begin
   xt := XmlType.CreateXML(x);

   for rec in (SELECT extractvalue(value(xTbl), '/values/value/text()') val FROM TABLE(XMLSEQUENCE(EXTRACT(xt, '//values/value'))) xTbl)
   loop
       /* This obviously runs two times but prints nothing */
       dbms_output.put_line(rec.val); 
       /* this works well */
       c := c + 1;
   end loop;
   /* This works correctly */
   dbms_output.put_line('Count: ' || c); 
End;

如您所见,我得到了正确的循环次数,但 rec.val 中没有任何内容。有人吗?

EXTRACTVALUE 已弃用。相反,使用 XMLTABLE.

SQL> SELECT xtbl.val 
FROM XMLTABLE('values/value'
        PASSING XMLTYPE('<values><value>1,"rrr|</value><value>2</value></values>')
        COLUMNS val VARCHAR2(10) PATH '.'
        ) xtbl;

VAL
----------
1,"rrr|
2

在光标中使用此查询。

declare 
    x nvarchar2(1000) := '<values><value>1,"rrr|</value><value>2</value></values>';
    xt XmlType;
    c number := 0;
Begin
   xt := XmlType.CreateXML(x);

   for rec in (
    SELECT xtbl.val 
        FROM XMLTABLE('values/value'
            PASSING xt
            COLUMNS val VARCHAR2(10) PATH '.'
            ) xtbl
            )
   loop
       dbms_output.put_line(rec.val); 
       c := c + 1;
   end loop;
   dbms_output.put_line('Count: ' || c); 
End;
/


1,"rrr|
2
Count: 2

PL/SQL procedure successfully completed.

您好,您不需要提取值中的整个路径...

将其更改为以下内容,它应该适合您

for rec in (SELECT extractvalue(value(xTbl), '/value') val FROM TABLE(XMLSEQUENCE(EXTRACT(xt, '//values/value'))) xTbl)

希望对您有所帮助