表名: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以满足我的需求。
答案 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';