如何在oracle中提取或更新xml属性值

时间:2015-05-10 12:22:05

标签: sql xml oracle xpath

表名:conn_details 我有这个xml存储在oracle中的CLOB列(conn_param)中。

<Parameters>
   <Parameter Name="USER" Value="my_user"/>
   <Parameter Name="PASSWORD" Value="my_password"/>
   <Parameter Name="HOST" Value="google.com"/>
</Parameters>

我正在寻找能够获得价值或将更新它的简单SQL查询。

例如: 我想得到一个HOST值,结果将是:google.com 我想用值my_new_password更新属性PASSWORD,结果将是:

<Parameters>
   <Parameter Name="USER" Value="my_user"/>
   <Parameter Name="PASSWORD" Value="my_new_password"/>
   <Parameter Name="HOST" Value="google.com"/>
</Parameters>

所以,我看起来很简单,我会提供一些XPath以满足我的需求。

2 个答案:

答案 0 :(得分:3)

要获取相关值,请使用此SQL:

SELECT extract(xmltype(conn_param), '/Parameters/Parameter[@Name="HOST"]/@Value') 
  FROM conn_details;

要更新xml值,请使用以下SQL:

UPDATE conn_details SET conn_param =   UPDATEXML(xmltype(conn_param),
   '/Parameters/Parameter[@Name="HOST"]/@Value',to_char('google.com')).getClobVal()

答案 1 :(得分:1)

首先,您必须将CLOB转换为XMLType,例如:

create table t (p CLOB) STORE P as ....;

insert into t values ('<Parameters>
   <Parameter Name="USER" Value="my_user"/>
   <Parameter Name="PASSWORD" Value="my_password"/>
   <Parameter Name="HOST" Value="google.com"/>
</Parameters>');

insert into t values ('<Parameters>
   <Parameter Name="USER" Value="my_user_2"/>
   <Parameter Name="PASSWORD" Value="my_password_2"/>
   <Parameter Name="HOST" Value="google.com_2"/>
</Parameters>');


create view v as 
select xmlparse(DOCUMENT p WELLFORMED) as XML_doc
from t;

然后您可以这样选择:

create view xml_scalar as 
SELECT 
   user_value, password_value, host_value, XML_doc
   FROM xml_view natural join
   XMLTABLE('/Parameters'
      PASSING xml_view.XML_doc
      COLUMNS 
         user_value varchar2(60) PATH 'Parameter[@Name="USER"]/@Value',
         password_value varchar2(60) PATH 'Parameter[@Name="PASSWORD"]/@Value',
         host_value varchar2(60) PATH 'Parameter[@Name="HOST"]/@Value')   
      x;

select user_value, password_value, host_value from  xml_scalar;       


| USER_VALUE | PASSWORD_VALUE |   HOST_VALUE |
|------------|----------------|--------------|
|    my_user |    my_password |   google.com |
|  my_user_2 |  my_password_2 | google.com_2 |

然后你应该可以进行这样的更新:

UPDATE xml_scalar
SET XML_doc =
   UPDATEXML(XML_doc,
   'Parameters/Parameter[@Name="PASSWORD"]/@Value', 'secret')
where user_value = 'my_user';
相关问题