Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新XML Clob节点_Sql_Xml_Database_Oracle_Qxmlquery - Fatal编程技术网

Sql 更新XML Clob节点

Sql 更新XML Clob节点,sql,xml,database,oracle,qxmlquery,Sql,Xml,Database,Oracle,Qxmlquery,我有一个表事务,其中我有一个clob xclob 我想将“property”节点的“record_start_dll_date”值更新为record_start_date(即我想删除_dll部分) 和“记录结束日期”来记录结束日期。 我正在使用oracle数据库。如何修改这些节点值 <?xml version ="1.0"?> <properties> <property name ="record_start_dll_date&

我有一个表事务,其中我有一个clob xclob

我想将“property”节点的“record_start_dll_date”值更新为record_start_date(即我想删除_dll部分) 和“记录结束日期”来记录结束日期。 我正在使用oracle数据库。如何修改这些节点值

<?xml version ="1.0"?>
<properties>
   <property name ="record_start_dll_date">
   <value>1/1/2021</value>
   </property>
    <property name ="record_dll_end_date">
   <value>21/12/2021</value>
   </property>
</properties>

1/1/2021
21/12/2021

您可以使用XMLQuery更新,或者使用特定属性值:

xmlquery ('copy $i := $p1 modify (
  (for $j in $i/properties/property[@name="record_start_dll_date"]/@name
    return replace value of node $j with $p2),
  (for $j in $i/properties/property[@name="record_dll_end_date"]/@name
    return replace value of node $j with $p3)
  ) return $i'
  passing xmltype(xclob) as "p1",
    'record_start_date' as "p2",
    'record_end_date' as "p3"
  returning content)
或剥离任何
\u dll

xmlquery ('copy $i := $p1 modify (
  for $j in $i/properties/property[contains(@name, "_dll")]/@name
    return replace value of node $j with replace($j, "_dll", "")
  ) return $i'
  passing xmltype(xclob) as "p1"
  returning content)
无论哪种方式,都可以将其合并到update语句中,并使用匹配的XMLExists子句来避免不必要的更新:

update transaction
set xclob = xmlquery ('copy $i := $p1 modify (
  for $j in $i/properties/property[contains(@name, "_dll")]/@name
    return replace value of node $j with replace($j, "_dll", "")
  ) return $i'
  passing xmltype(xclob) as "p1"
  returning content).getclobval()
where xmlexists('$p1/properties/property[contains(@name, "_dll")]'
  passing xmltype(xclob) as "p1")

你想要什么还不是很清楚。您是否正在更改属性名称,以有效地删除
\u dll
部分?或者将这些节点的值更改为不同的日期-在这种情况下,这些新日期来自何处?如果有多个CLOB,它们是否都需要对属性或值进行相同的更改?您是在更新表中的CLOB值,还是在查询时更新它?@AlexPoole是的,我想从属性名称中删除_dll部分。@AlexPoole非常感谢,在您的帮助下,我终于更新了我的记录。