遍历存储过程中的 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)
希望对您有所帮助
我正在尝试 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)
希望对您有所帮助