【问题标题】:How to extract value from xml clob with identical tags using FOR LOOP in PL/SQL如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值
【发布时间】: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(第一个,第二个...)。

谢谢!

【问题讨论】:

    标签: xml plsql


    【解决方案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 请求。效率太低了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-09-07
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多