【问题标题】:How to retrieve specific data from XML in Oracle table如何从 Oracle 表中的 XML 检索特定数据
【发布时间】:2019-02-13 07:39:07
【问题描述】:

我有一个 oracle 表,其中有一列存储 XML。 XML 具有以下语法:

<?xml version="1.0"?>
<MessageData>
  <TextblockParameters>
    <TextblockParameter>
      <tagName>BUSINESSPROCESSID</tagName>
      <value>RETAIL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>SEGMENT</tagName>
      <value>RESIDENTIAL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>TRANSACTIONTYPE</tagName>
      <value>PURCHASE</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>LANGUAGE</tagName>
      <value>EST</value>
    </TextblockParameter>
  </TextblockParameters>
</MessageData>

现在我需要从所有 4 个地方的 &lt;value&gt;&lt;/Value&gt; 获取信息。请帮助解决这个问题,不知道 Extractvalue 是否是最佳解决方案

【问题讨论】:

    标签: sql xml oracle extract extract-value


    【解决方案1】:

    您可以为此使用XMLTABLE 函数(see examples):

    SELECT t.foo, xt.*
    FROM t, XMLTABLE('//TextblockParameter'
        PASSING t.xmlcol
        COLUMNS
            tagName VARCHAR2(100) PATH './tagName',
            value VARCHAR2(100) PATH './value'
    ) xt;
    

    Demo on db<>fiddle

    【讨论】:

      【解决方案2】:

      你可以使用

      select extract(col1, '//value') from t;
      
      create table t (col1 xmltype);
      
      insert into t values ('
      <MessageData>
        <TextblockParameters>
          <TextblockParameter>
            <tagName>BUSINESSPROCESSID</tagName>
            <value>RETAIL</value>
          </TextblockParameter>
          <TextblockParameter>
            <tagName>SEGMENT</tagName>
            <value>RESIDENTIAL</value>
          </TextblockParameter>
          <TextblockParameter>
            <tagName>TRANSACTIONTYPE</tagName>
            <value>PURCHASE</value>
          </TextblockParameter>
          <TextblockParameter>
            <tagName>LANGUAGE</tagName>
            <value>EST</value>
          </TextblockParameter>
        </TextblockParameters>
      </MessageData>');
      
      1 行受影响
      select extract(col1, '//value') from t;
      
      | EXTRACT(COL1,'//值') | | :------------------------------------------------- -------------------------------------------------- ---- | | 零售
      住宅
      购买
      EST
      |

      db小提琴here

      【讨论】:

      • 得到错误:ORA-00932:不一致的数据类型:预期 - 得到 - 00932。00000 -“不一致的数据类型:预期 %s 得到 %s”
      • 您的源列类型是什么?
      • 试试select extract(XMLTYPE(col1), '//value') from t
      • extract(和 extractvalue)是不推荐使用的函数,所以我不建议任何人使用它们。 XMLTABLE 是前进的方向。
      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多