gpt4 book ai didi

Oracle 从 xmltype 中提取值

转载 作者:行者123 更新时间:2023-12-04 00:42:23 26 4
gpt4 key购买 nike

这是我目前使用的代码:

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 中只有一个数据,而且我只有一个nameage 标签。

下面的代码应该用于保存到 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;

/任何更好的方法表示赞赏..谢谢

最佳答案

如果你真的确定你只有一个 ROW 那么你可以这样做:

begin
l_xml := xmltype(i_xml);
if l_xml.existsnode('/ROWSET/ROW/name') > 0 then
l_name := l_xml.extract('/ROWSET/ROW/name/text()').getstringval();
end if;
if l_xml.existsnode('/ROWSET/ROW/age') > 0 then
l_age := l_xml.extract('/ROWSET/ROW/age/text()').getnumberval();
end if;
end;

如果您有 nameage,或两者皆有,或两者都没有(这里的“工作”至少意味着没有错误),这将起作用。如果你确实有不止一行,它会连接结果,所以对于你的原始数据,l_name 将是 aabbb,而 l_age 将是2025。这可能不是您所期望的。

关于Oracle 从 xmltype 中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17544610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com