如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值
Posted
技术标签:
【中文标题】如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值【英文标题】:How to extract value from xml clob with identical tags using FOR LOOP in PL/SQL 【发布时间】:2019-01-21 10:41:24 【问题描述】:在大多数情况下,我处理具有以下结构的简单 xml CLOB:
<SuggestResponse>
<suggestions>
<value>ПАО "Cбербанк"</value>
....
....
</suggestions>
</SuggestResponse>
我可以轻松提取值,然后将它们与我拥有的任何变量进行比较:
IF variable = xmltype(xmlclob.extract('SuggestResponse/suggestions/value/text()').getstringval() THEN
.....
END IF;
但有时我会得到具有不同结构的 XML CLOB:
<SuggestResponse>
<suggestions>
<value>ПАО "Cбербанк"</value>
....
....
</suggestions>
<suggestions>
<value>ПАО Банк «ФК Открытие»</value>
....
....
</suggestions>
</SuggestResponse>
有 2 个或更多标签,我不知道如何使用 FOR LOOP 检查每个标签。如何指向当前正在使用 <suggestions>
的 FOR LOOP(第一个,第二个...)。
谢谢!
【问题讨论】:
【参考方案1】:如果我是你,我会避免使用已弃用的提取(和提取值)并使用 XMLTABLE 来查询 xml 文档的内容。这比遍历同一个文档单独提取内容要快,因为这意味着 xml 文档只需要读取一次。
你可以这样做:
DECLARE
v_xml XMLTYPE := XMLTYPE('<SuggestResponse>
<suggestions>
<value>fred</value>
<node2>abc</node2>
<node3>1</node3>
</suggestions>
<suggestions>
<value>bob</value>
<node2>def</node2>
</suggestions>
</SuggestResponse>');
BEGIN
FOR rec IN (SELECT *
FROM XMLTABLE('/SuggestResponse/suggestions' PASSING v_xml
COLUMNS val varchar2(100) PATH 'value',
node2 VARCHAR2(10) PATH 'node2',
node3 NUMBER PATH 'node3'))
LOOP
IF rec.node2 = 'abc'
THEN
dbms_output.put_line(rec.val||': hurrah!');
ELSE
dbms_output.put_line(rec.val||': boo!');
END IF;
END LOOP;
END;
/
fred: hurrah!
bob: boo!
【讨论】:
非常感谢您提供这个惊人的解决方案!我要重写我的很多代码。因为每次我使用 getstringval() 我都会发出返回大量 XML 的 http 请求。效率太低了!以上是关于如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值的主要内容,如果未能解决你的问题,请参考以下文章