【问题标题】:Error when using "string-join" in xmltable在 xmltable 中使用“字符串连接”时出错
【发布时间】:2020-06-22 17:32:24
【问题描述】:

我的 xml 数据类似于:

<Document>    
<paymentsts>
         <ref>abc-123</ref>
         <TxSts>RJCT</TxSts>
          <StsRsnInf>
              <Rsn>
                <Cd>FF02</Cd>
              </Rsn>
              <AddtlInf>SyntaxError</AddtlInf>
              <AddtlInf>Error: Invalid Input Character</AddtlInf>
           </StsRsnInf>
    </paymentsts>
</Document>

我正在使用 XMLTABLE 来提取 SQL 查询中的信息,并且我正在努力从 AddtlInf 获取数据。因为该元素可以出现多次,我认为我可以使用 string-join 但这不起作用。我收到错误 PL/SQL: ORA-19109: RETURNING keyword expected。

重现的代码如下:

declare
  v_xml constant xmltype := xmltype('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Document>
 <paymentsts>
         <ref>abc-123</ref>
         <TxSts>RJCT</TxSts>
          <StsRsnInf>
              <Rsn>
                <Cd>FF02</Cd>
              </Rsn>
              <AddtlInf>SyntaxError</AddtlInf>
              <AddtlInf>Error: Invalid Input Character</AddtlInf>
           </StsRsnInf>
    </paymentsts>
</Document>'
);
 l_info VARCHAR2(500);
begin
  select   errinfo
    into l_info
  from xmltable(
    'Document/paymentsts/StsRsnInf' 
    passing v_xml
    columns
    errinfo varchar2(500) PATH 'string-join(AddtlInf, '','')'
    );

  dbms_output.put_line('(l_info = ' || l_info );
end;

我错过了什么?

【问题讨论】:

    标签: xml oracle


    【解决方案1】:

    误导性错误信息,我想说。这与您滥用string-join 的单引号有关。您应该使用双引号而不是两个连续的单引号:

    No : errinfo varchar2(500) PATH 'string-join(AddtlInf, '','')'
    
    Yes: errinfo varchar2(500) PATH 'string-join(AddtlInf, ",")'
    

    整个查询:

    SQL> declare
      2    v_xml constant xmltype := xmltype('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
      3  <Document>
      4   <paymentsts>
      5           <ref>abc-123</ref>
      6           <TxSts>RJCT</TxSts>
      7            <StsRsnInf>
      8                <Rsn>
      9                  <Cd>FF02</Cd>
     10                </Rsn>
     11                <AddtlInf>SyntaxError</AddtlInf>
     12                <AddtlInf>Error: Invalid Input Character</AddtlInf>
     13             </StsRsnInf>
     14      </paymentsts>
     15  </Document>'
     16  );
     17   l_info VARCHAR2(500);
     18  begin
     19    select   errinfo
     20      into l_info
     21    from xmltable(
     22      'Document/paymentsts/StsRsnInf'
     23      passing v_xml
     24      columns
     25      errinfo varchar2(500) PATH 'string-join(AddtlInf, ",")'
     26      );
     27
     28    dbms_output.put_line('(l_info = ' || l_info );
     29  end;
     30  /
    (l_info = SyntaxError,Error: Invalid Input Character
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    有趣的是,如果您使用 q-quoting 机制,它可以与连续的单引号一起使用:

    errinfo varchar2(500) path q'[string-join(AddtlInf, '', '')]'
    

    试试看。

    【讨论】:

    • 非常感谢。我错误地假设这只是转义单引号。双引号解决了这个问题。非常感谢
    【解决方案2】:

    您还可以获取单个值并使用listagg 连接它们:

    ...
    begin
      select listagg(addtlinf, ',') within group (order by ord)
        into l_info
      from xmltable(
        'Document/paymentsts/StsRsnInf/AddtlInf'
        passing v_xml
        columns
        addtlinf varchar2(500) PATH '.',
        ord for ordinality
        );
    
      dbms_output.put_line('l_info = ' || l_info);
    end;
    

    假设您还需要其他列,您可以链接 XMLTable 调用:

    ...
    begin
      select a.ref, listagg(b.addtlinf, ',') within group (order by ord)
        into l_ref, l_info
      from xmltable(
        'Document/paymentsts'
        passing v_xml
        columns
        ref varchar2(10) PATH 'ref',
        txsts varchar2(10) PATH 'TxSts',
        rsn varchar2(10) PATH 'StsRsnInf/Cd',
        info xmltype PATH 'StsRsnInf/AddtlInf'
        ) a
      cross join xmltable(
        'AddtlInf'
        passing info
        columns
        addtlinf varchar2(500) PATH '.',
        ord for ordinality
        ) b
      group by a.ref;
    
      dbms_output.put_line('lref = ' || l_ref); 
      dbms_output.put_line('l_info = ' || l_info);
    end;
    

    db<>fiddle

    或者您可以在主查询 XPath 中使用 string-join 来转换 XML,然后再使用 columns 子句。

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2019-11-03
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2016-01-21
      • 2020-10-30
      相关资源
      最近更新 更多