Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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 无法使用extractvalue函数获取数据_Sql_Xml_Oracle_Xpath - Fatal编程技术网

Sql 无法使用extractvalue函数获取数据

Sql 无法使用extractvalue函数获取数据,sql,xml,oracle,xpath,Sql,Xml,Oracle,Xpath,我有一个表,在Oracle DB中有一个XML类型的列。我试图在该表上使用extractvalue和updatexml函数 XML 有人能告诉我我做错了什么吗 整理完摘录后,我想将描述从计划付款替换为计划前付款。您正在做的是工作-它将为您提供具有该属性值的记录节点的文本值。但该节点是空的: <record DESCRIPTION="Plan Payment" RATE="480000" TAX="0"/> 但是,它早就被弃用了,所以无论如何,您都不应该真正使用它 可以使用查看整个匹

我有一个表,在Oracle DB中有一个XML类型的列。我试图在该表上使用extractvalue和updatexml函数

XML

有人能告诉我我做错了什么吗


整理完摘录后,我想将描述从计划付款替换为计划前付款。

您正在做的是工作-它将为您提供具有该属性值的记录节点的文本值。但该节点是空的:

<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>