Sql 无法使用extractvalue函数获取数据
我有一个表,在Oracle DB中有一个XML类型的列。我试图在该表上使用extractvalue和updatexml函数 XML 有人能告诉我我做错了什么吗Sql 无法使用extractvalue函数获取数据,sql,xml,oracle,xpath,Sql,Xml,Oracle,Xpath,我有一个表,在Oracle DB中有一个XML类型的列。我试图在该表上使用extractvalue和updatexml函数 XML 有人能告诉我我做错了什么吗 整理完摘录后,我想将描述从计划付款替换为计划前付款。您正在做的是工作-它将为您提供具有该属性值的记录节点的文本值。但该节点是空的: <record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/> 但是,它早就被弃用了,所以无论如何,您都不应该真正使用它 可以使用查看整个匹
整理完摘录后,我想将描述从计划付款替换为计划前付款。您正在做的是工作-它将为您提供具有该属性值的记录节点的文本值。但该节点是空的:
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
但是,它早就被弃用了,所以无论如何,您都不应该真正使用它
可以使用查看整个匹配记录节点;由于节点没有内容,因此获取其内容没有多大意义,正如当前查询所做的那样:
select XMLQuery('$x//record[@DESCRIPTION="Plan Payment"]'
passing xmlcontent as "x"
returning content
) as result
from table_xml;
RESULT
--------------------------------------------------------------------------------
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
对示例XML文档使用CTE,并将其包装在XMLSerialize调用中以保留格式以保持可读性:
with table_xml (xmlcontent) as (
select xmltype(q'[<?xml version = '1.0' encoding = 'UTF-8'?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>]'
) from dual
)
select XMLSerialize(
document
XMLQuery('copy $i := $x modify
(for $j in $i//record[@DESCRIPTION="Plan Payment"]/@DESCRIPTION
return replace value of node $j with $r)
return $i'
passing xmlcontent as "x", 'Pre Plan Payment' as "r"
returning content
)
indent
) as result
from table_xml;
RESULT
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Pre Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>
如果要更新表中的值,可以将同一查询用作update语句的一部分,并对匹配的行进行筛选 您正在做的是工作-它将使用该属性值为您提供记录节点的文本值。但该节点是空的:
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
但是,它早就被弃用了,所以无论如何,您都不应该真正使用它
可以使用查看整个匹配记录节点;由于节点没有内容,因此获取其内容没有多大意义,正如当前查询所做的那样:
select XMLQuery('$x//record[@DESCRIPTION="Plan Payment"]'
passing xmlcontent as "x"
returning content
) as result
from table_xml;
RESULT
--------------------------------------------------------------------------------
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
对示例XML文档使用CTE,并将其包装在XMLSerialize调用中以保留格式以保持可读性:
with table_xml (xmlcontent) as (
select xmltype(q'[<?xml version = '1.0' encoding = 'UTF-8'?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>]'
) from dual
)
select XMLSerialize(
document
XMLQuery('copy $i := $x modify
(for $j in $i//record[@DESCRIPTION="Plan Payment"]/@DESCRIPTION
return replace value of node $j with $r)
return $i'
passing xmlcontent as "x", 'Pre Plan Payment' as "r"
returning content
)
indent
) as result
from table_xml;
RESULT
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Pre Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>
如果要更新表中的值,可以将同一查询用作update语句的一部分,并对匹配的行进行筛选 记录节点没有内容,只有属性;那么您希望看到什么输出呢?您的记录节点没有内容,只有属性;那么您希望看到什么样的输出呢?谢谢@Alex。我能够根据您给定的语法使用updatexml进行更新。虽然我不能使用XMLQuery,但它仍然返回nullThank@Alex。我能够根据您给定的语法使用updatexml进行更新。虽然我不能使用XMLQuery,但它仍然返回null
with table_xml (xmlcontent) as (
select xmltype(q'[<?xml version = '1.0' encoding = 'UTF-8'?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>]'
) from dual
)
select XMLSerialize(
document
XMLQuery('copy $i := $x modify
(for $j in $i//record[@DESCRIPTION="Plan Payment"]/@DESCRIPTION
return replace value of node $j with $r)
return $i'
passing xmlcontent as "x", 'Pre Plan Payment' as "r"
returning content
)
indent
) as result
from table_xml;
RESULT
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<custominfo>
<singlerecord ZIP="51100"/>
<multiplerecord type="ONE_TIME_CHARGES_LIST">
<record DESCRIPTION="Device Payment" RATE="1000000" TAX="0"/>
<record DESCRIPTION="Pre Plan Payment" RATE="480000" TAX="0"/>
<record DESCRIPTION="Deposit" RATE="1000000" TAX="0"/>
</multiplerecord>
</custominfo>