【问题标题】:SQL Error: ORA-00932: inconsistent datatypes: expected - got CHARSQL 错误:ORA-00932:不一致的数据类型:预期 - 得到 CHAR
【发布时间】:2017-02-28 08:17:29
【问题描述】:

当我在 Oracle 上运行此简单查询以删除 SQL*PLUS 中的一行时,我收到错误:

Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected - got CHAR
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

完整代码:

delete from db where TITLE= '<values><value lang="EN">db shared</value></values>'; 

错误:

Error starting at line : 8 in command -
delete from widget_template where TITLE= '<values><value lang="EN">template shared for assets</value></values>'
Error at Command Line : 8 Column : 42
Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected - got CHAR
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

我试过了:

delete from db where to_char(TITLE)= '&lt;value lang="EN"&gt;template shared for all assets&lt;/value&gt;';

这样我得到以下错误:

ORA-00932: inconsistent datatypes: expected NUMBER got -
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

PS:这是 TITLE col 的外观:

不知道如何解决这个问题..有什么想法吗? 谢谢

【问题讨论】:

  • TITLE 列的类型是什么?
  • 你确定吗?它似乎是一个 XMLTYPE
  • 你是对的......我的错。

标签: sql oracle


【解决方案1】:

错误似乎是由于TITLE 列是XMLTYPE。 如果是这样,这可以是一种方式:

delete from db
where  xmltype.getstringval(TITLE)= '<value lang="EN">template shared for all assets</value>'

【讨论】:

  • 好了,错误消失了,但是当我运行查询时,它说:0 行已删除。
【解决方案2】:

您可以使用 XMLQuery 将 XML 与您想要的值进行比较,例如使用:

xmlquery('for $i in /values/value[@lang="EN"]
    where $i/text() = "template shared for all assets" return $i'
  passing title returning content)

快速演示:

create table db (id number, title xmltype);
insert into db (id, title) values (1,
  xmltype('<values><value lang="EN">db shared</value></values>'));
insert into db (id, title) values (2,
  xmltype('<values><value lang="EN">template shared for all assets</value></values>'));

select id,
  xmlquery('/values/value[@lang="EN"]/text()' passing title returning content) as title,
  xmlquery('for $i in /values/value[@lang="EN"]
      where $i/text() = "template shared for all assets" return $i/text()'
    passing title returning content) as matched
from db
order by id;

        ID TITLE                               MATCHED                            
---------- ----------------------------------- -----------------------------------
         1 db shared                                                              
         2 template shared for all assets      template shared for all assets     

delete from db
where xmlquery('for $i in /values/value[@lang="EN"]
    where $i/text() = "template shared for all assets" return $i'
  passing title returning content) is not null;

1 row deleted.

select id,
  xmlquery('/values/value[@lang="EN"]/text()' passing title returning content) as title,
  xmlquery('for $i in /values/value[@lang="EN"]
      where $i/text() = "template shared for all assets" return $i/text()'
    passing title returning content) as matched
from db
order by id;

        ID TITLE                               MATCHED                            
---------- ----------------------------------- -----------------------------------
         1 db shared                                                              

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多