这是我目前使用的代码:
SET serveroutput ON
CREATE OR REPLACE
PROCEDURE test_proc(i_xml varchar2)
IS
l_name VARCHAR2(20);
l_age NUMBER;
l_xml xmltype;
BEGIN
l_xml := xmltype(i_xml);
FOR x IN
(SELECT VALUE(p) col_val
FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml, '/ROWSET/ROW'))) p
)
LOOP
IF x.col_val.existSNode('/ROW/name/text()') > 0 THEN
l_name:= x.col_val.EXTRACT('/ROW/name/text()').getstringVal();
END IF;
IF x.col_val.existSNode('/ROW/age/text()') > 0 THEN
l_age := x.col_val.EXTRACT('/ROW/age/text()').getstringVal();
END IF;
end loop;
end;
/
BEGIN
test_proc('<ROWSET>
<ROW>
<name>aa</name>
<age>20</age>
</ROW>
<ROW>
<name>bbb</name>
<age>25</age>
</ROW>
</ROWSET>');
END;
/
上面的代码使用 xml 来提取现有节点值并将其保存到特定的局部变量中。它已用于多组数据的案例,并且工作正常。我只是想知道我是否可以在没有“for x 循环”的情况下使用它,因为从现在开始我将在 i_xml 中只有一个数据,而且我只会有
name
or 或age
tags 。
下面的代码应该被用来保存到 l_name 或 l_age 没有我上面使用的“循环”方法:
<ROWSET>
<ROW>
<name>aa</name>
</ROW>
</ROWSET>
或者
<ROWSET>
<ROW>
<age>18</age>
</ROW>
</ROWSET>
/ 我尝试过使用以下内容:
SELECT
CASE
WHEN VALUE(p).existsNode('/ROW/name/text()') = 1
THEN p.EXTRACT('/ROW/name/text()').getstringVal()
WHEN VALUE(P).existsNode('/ROW/age/text()') = 1
THEN p.EXTRACT('/ROW/age/text()').getstringVal()
END
INTO l_new
FROM TABLE(xmlsequence(EXTRACT(l_xml, '/ROWSET/ROW'))) p;
/感谢任何更好的方法..谢谢