使用 Oracle 数据库中的 SQL 从 CLOB 数据中提取数据

Posted

技术标签:

【中文标题】使用 Oracle 数据库中的 SQL 从 CLOB 数据中提取数据【英文标题】:Extracting Data from CLOB data using SQL from Oracle Database 【发布时间】:2016-12-21 14:45:41 【问题描述】:

我有一个名为“device”的表,其中包含一个名为“XMLdoc”的 CLOB 数据类型的列。我想更新 Value 字段。

Name="DropDirectory" Value=""

/*Following is the sample XML:*/

<?xml version="1.0" encoding="UTF-8"?>
<Attributes>
    <Attribute DataType="Text-40" DisplayName="PrinterAlias"
        IsNotDeletable="Y" Modifiable="Y" Name="PrinterAlias" Value="QALABHP"/>
    <Attribute DisplayName="PrintServerHostName"
        Name="PrintServerHostName" Value="zzzzz"/>
    <Attribute DisplayName="PrintServerPort" Name="PrintServerPort" Value="2723"/>
    <Attribute DataType="Text-40" DisplayName="DropDirectory"
        IsNotDeletable="Y" Modifiable="Y" **Name="DropDirectory" Value=""/>
</Attributes>

【问题讨论】:

你的问题是什么? 【参考方案1】:

您可以如下更新:

选择:

SELECT extract(xmltype(col1), '/Attributes/Attribute[@Name="DropDirectory"]/@Value') 
  FROM test_clob;

输出:

 SQL> SELECT extract(xmltype(col1), '/Attributes/Attribute[@Name="DropDirectory"]/@Value') 
  FROM test_clob;    

EXTRACT(XMLTYPE(COL1),'/ATTRIBUTES/ATTRIBUTE[@NAME="DROPDIRECTORY"]/@VALUE')
--------------------------------------------------------------------------------

更新:

 UPDATE test_clob 
  SET col1 =   UPDATEXML(xmltype(col1),
   '/Attributes/Attribute[@Name="DropDirectory"]/@Value',to_char('google.com')).getClobVal()

输出:

 SQL> /

EXTRACT(XMLTYPE(COL1),'/ATTRIBUTES/ATTRIBUTE[@NAME="DROPDIRECTORY"]/@VALUE')
--------------------------------------------------------------------------------
google.com

注意:用我的替换你的表名和列名。

【讨论】:

XMLType.getClobVal 方法已被弃用,应使用 XMLSerialize。【参考方案2】:

您没有指定您的 Oracle 版本。我假设它是 11g..(注意:如果您使用的是 12c,您可能应该使用 XQuery)。

这里我将 Value 属性更新为 new_value。

select xmlserialize(content updatexml(xmltype(
'<Attributes>
    <Attribute DataType="Text-40" DisplayName="PrinterAlias"
        IsNotDeletable="Y" Modifiable="Y" Name="PrinterAlias" Value="QALABHP"/>
    <Attribute DisplayName="PrintServerHostName"
        Name="PrintServerHostName" Value="zzzzz"/>
    <Attribute DisplayName="PrintServerPort" Name="PrintServerPort" Value="2723"/>
    <Attribute DataType="Text-40" DisplayName="DropDirectory"
        IsNotDeletable="Y" Modifiable="Y" Name="DropDirectory" Value=""/>
</Attributes>'), '/Attributes/Attribute[@Name="DropDirectory"]/@Value', 'new_value'))
from dual

结果(CLOB):

<Attributes>
   <Attribute DataType="Text-40" DisplayName="PrinterAlias" IsNotDeletable="Y" Modifiable="Y" Name="PrinterAlias" Value="QALABHP" />
   <Attribute DisplayName="PrintServerHostName" Name="PrintServerHostName" Value="zzzzz" />
   <Attribute DisplayName="PrintServerPort" Name="PrintServerPort" Value="2723" />
   <Attribute DataType="Text-40" DisplayName="DropDirectory" IsNotDeletable="Y" Modifiable="Y" Name="DropDirectory" Value="new_value" />
</Attributes>

【讨论】:

以上是关于使用 Oracle 数据库中的 SQL 从 CLOB 数据中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle 数据库中的 SQL 从 CLOB 数据中提取数据

如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?

从 Microsoft SQL Server 搜索链接服务器 (Oracle) 中的列名 [重复]

从 PL/SQL 调用另一个 Oracle 数据库中的过程

使用命令将存储过程查询从 sql 文件导入 Oracle DB

如何从oracle sql中的选择计数中对rownum使用case语句?