如何在 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 检查每个标签。如何指向当前正在使用 &lt;suggestions&gt; 的 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 中提取值的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL loop循环详解

pl sql cursor for loop in

Oracle PL/SQL之LOOP循环控制语句

Oracle PL/SQL之LOOP循环控制语句

Oracle PL/SQL之LOOP循环控制语句

PL/SQL控制语句(循环控制语句)