【问题标题】:Using PL/SQL to extract value of an XML attribute使用 PL/SQL 提取 XML 属性的值
【发布时间】:2018-07-24 11:02:53
【问题描述】:

我有一些 XML(给出的例子)

<emails>
    <email email_id="user1@email.com"/>
    <email email_id="user2@email.com"/>
    ...
    <email email_id="user8@email.com"/>
<emails>

我想从每个电子邮件节点获取 email_id 并将其放入一个字符串中。例如“user1@email.com, user2@email.com, user3@email.com...”

我猜我需要以某种形式使用 xmltable,但除了将它们写入 select 语句之外,我不知道如何获取要使用的值。

【问题讨论】:

    标签: sql xml oracle plsql


    【解决方案1】:

    您可以为此使用 XMLTYPE 选项

    SQL> set serverout on
    SQL> declare
      2    x xmltype := xmltype(
      3    '<emails>
      4      <email email_id="user1@email.com"/>
      5      <email email_id="user2@email.com"/>
      6      <email email_id="user8@email.com"/>
      7  </emails>');
      8
      9    email_list sys.odcivarchar2list := sys.odcivarchar2list();
     10
     11    e varchar2(100);
     12  begin
     13    for i in 1 .. 1000
     14    loop
     15      if x.existSNode('/emails/email['||i||']') > 0 then
     16         e:=    x.extract('/emails/email['||i||']/@email_id').getstringVal();
     17         dbms_output.put_line(e);
     18         email_list.extend;
     19         email_list(i) := e;
     20      else
     21        exit;
     22      end if;
     23    end loop;
     24  end;
     25  /
    user1@email.com
    user2@email.com
    user8@email.com
    
    PL/SQL procedure successfully completed.
    

    【讨论】:

    • 谢谢,我认为这为我提供了一个很好的模板来满足我的需要。
    【解决方案2】:
    SELECT
    LISTAGG(emailId, '; ')  
    WITHIN GROUP(ORDER BY  emailId) "EmailList"
    FROM
    (
    select emailId 
    FROM XMLTABLE('/emails/email'  
             PASSING   
                xmltype('
                   <emails>
        <email email_id="user1@email.com"/>
        <email email_id="user2@email.com"/>   
        <email email_id="user8@email.com"/>
          </emails>
                ')
             COLUMNS  
    
                emailId  varchar2(200)     PATH './@email_id'
         ) xmlt  
     )
    
    ;
    

    【讨论】:

    • 我已经接近了这一点,但我将如何将电子邮件 ID 串在一起。那是我不确定的步骤
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多