UPDATEXML 抛出 SQL 错误:ORA-00927:尝试转换和更新 CLOB 数据类型时缺少等号

Posted

技术标签:

【中文标题】UPDATEXML 抛出 SQL 错误:ORA-00927:尝试转换和更新 CLOB 数据类型时缺少等号【英文标题】:UPDATEXML throws SQL Error: ORA-00927: missing equal sign when attempting to convert and update CLOB datatype 【发布时间】:2017-10-02 20:07:04 【问题描述】:

我通过 UPDATEXML 函数的 Oracle 文档页面完成了该示例: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm

现在,我正在尝试将其应用于我的数据库中的数据。我的数据库中的列是CLOB(用于多个事物),所以我需要在执行xml相关操作之前将我的数据转换为xmltype。但是,我的尝试返回以下错误SQL Error: ORA-00927: missing equal sign

有没有办法在不修改列数据类型的情况下更新clob存储的xml?


尝试

在我的数据库的数据类型中重复使用 Oracle 示例。1。创建表

CREATE TABLE xwarehouses
(  
  MSD_ID INTEGER,
  CDATA CLOB
);

2。添加数据

INSERT INTO xwarehouses VALUES 
  (1,
  ('<?xml version="1.0"?>
   <Warehouse>
    <WarehouseId>1</WarehouseId>
    <WarehouseName>Southlake, Texas</WarehouseName>
    <Building>Owned</Building>
    <Area>25000</Area>
    <Docks>2</Docks>
    <DockType>Rear load</DockType>
    <WaterAccess>true</WaterAccess>
    <RailAccess>N</RailAccess>
    <Parking>Street</Parking>
    <VClearance>10</VClearance>
   </Warehouse>'));

3.将 CLOB 转换为 XMLTYPE 以从指定标签中提取值

SELECT EXTRACTVALUE(XMLTYPE(cdata),'/Warehouse/WaterAccess') as VAL from xwarehouses;

VAL | true

4.尝试在 UPDATE 中使用相同的转换来更新值

update XWAREHOUSES
set XMLTYPE(cdata) = 
    updatexml(XMLTYPE(cdata),'/Warehouse/WaterAccess/text()','false')
where msd_id = 1;

**5。这将返回错误: SQL Error: ORA-00927: missing equal sign

【问题讨论】:

我认为 set XMLTYPE(cdata) = 应该设置为 cdata = 并假设集合的右侧将隐式转换为 CLOB。试一试,让我知道。 PL/SQL 也是一个可以考虑的选项吗? 如果我在 SET 中删除 XMLTYPE,但将其保留在 XMLUPDATE 中,我会得到SQL Error: ORA-00932: inconsistent datatypes: expected CLOB got - 00932. 00000 - "inconsistent datatypes: expected %s got %s" 如果我删除两边的 XMLTYPE 我得到:SQL Error: ORA-00932: inconsistent datatypes: expected - got - 00932. 00000 - "inconsistent datatypes: expected %s got %s" 您的意思是在这里编写某种形式的存储过程不是直接更新的选项吗? 【参考方案1】:

好的,我解决了这两种不同的方法,两种方法基本相同,但一种是查询,一种是脚本。

解决方案 1

将数据加载为xmltype,然后执行xml操作,最后在执行更新前转换回clob

update xwarehouses
set cdata =
(
  select updatexml(xmltype(cdata),'/Warehouse/WaterAccess/text()','true').getclobval() 
  from xwarehouses where msd_id = 1
)
where msd_id = 1;
commit;

解决方案 2

这不是最整洁的版本,因为我可能会使用来自 solution 1 的查询并添加一些变量。这对列出的所有转化基本上都是一样的。

DECLARE
  p_msg_id number := 1;
  p_cdata xmltype;  
  p_value varchar(50) :='false';
  p_data clob;

BEGIN
  select cdata into p_data from xwarehouses;
  p_cdata := xmltype(p_data);
  select updatexml(p_cdata,'/Warehouse/WaterAccess/text()',p_value) into p_cdata from dual;
  p_data := p_cdata.getclobval();
  update xwarehouses
  set cdata = p_data
  where msd_id = p_msg_id;
  commit;

END;

【讨论】:

【参考方案2】:

来自 ORACLE 11

所有用于更新 XML 数据的 Oracle SQL 函数均已弃用。甲骨文 建议您改用 XQuery Update。这些是 不推荐使用的 XML 更新函数:

Migration from Oracle Functions for Updating XML Data to XQuery Update

例子:

UPDATE xwarehouses SET cdata =
  xmlserialize(document XMLQuery('copy $tmp := $source  modify
            (for $i in $tmp/Warehouse/WaterAccess/text()  
             return replace value of node $i
                    with "false") 
            return $tmp'
           PASSING xmltype(cdata) as "source"  RETURNING CONTENT))
  WHERE cdata IS NOT NULL;

【讨论】:

以上是关于UPDATEXML 抛出 SQL 错误:ORA-00927:尝试转换和更新 CLOB 数据类型时缺少等号的主要内容,如果未能解决你的问题,请参考以下文章

ORA-0 [BEA][Oracle JDBC Driver] 未处理的 sql 类型

sql注入之常见注入类型

MySQL注入 | updatexml和extractvalue函数

Navicat:连接Oracle时,提示ORA-28547,Cannot load OCI DLL.193,ORA-03135错误

Navicat:连接Oracle时,提示ORA-28547,Cannot load OCI DLL.193,ORA-03135错误

SQL——抛出错误