ORA-00932:数据类型不一致:预期-获得CLOB


70

考虑到这TEST_SCRIPT就是CLOB 为什么当我在Oracle上从SQL * PLUS运行此简单查询时出现错误的原因:

ORA-00932: inconsistent datatypes: expected - got CLOB

我一直在阅读很多有关同一错误的问题,但这些问题都没有从SQLPLUS运行直接查询

    UPDATE IMS_TEST 
       SET TEST_Category  = 'just testing'  
     WHERE TEST_SCRIPT    = 'something'
       AND ID             = '10000239' 

完整示例:

SQL> create table ims_test(
  2  test_category varchar2(30),
  3  test_script clob,
  4  id varchar2(30)
  5  );

Table created.

SQL> insert into ims_test values ('test1','something','10000239');

1 row created.

SQL> UPDATE IMS_TEST
  2  SET TEST_Category  = 'just testing'
  3  WHERE TEST_SCRIPT    = 'something'
  4  AND ID             = '10000239';
WHERE TEST_SCRIPT    = 'something'
      *
ERROR at line 3:
ORA-00932: inconsistent datatypes: expected - got CLOB

您的实际脚本中是否包含问题中出现的Microsoft弯引号?还是仅仅是提出问题的产物?在实际脚本中,字符串'something'实际上是否超过4000个字符?
贾斯汀·凯夫

对不起,您用大括号括起来是什么意思?您是否建议引用不是正确的引用?在此示例中,字符串s =就是这样。我可能在实际产品中有更大的限制,但是我只是想看看这个简单的查询是否有效。
user1298925

@ user1298925,此查询将起作用,但是如果您尝试在clob字段中插入超过4000个字符
rs

1
@ user1298925-在您发布的问题中,字符串周围的引号just testing是Microsoft的弯引号,而不是普通的单引号'。我已在编辑中更正了该问题,但是不确定是影响您的原始脚本还是在创建和发布问题的过程中引入了某些内容。您是在说示例脚本中的字符串实际上只有10个字符吗?
贾斯汀·凯夫

是的,它们实际上只是10个字符,我确保单引号也正确键入。
user1298925 2012年

Answers:


71

您不能将CLOB放在WHERE子句中。从文档中

比较条件中不支持大对象(LOB)。但是,您可以使用PL / SQL程序对CLOB数据进行比较。

如果您的值始终小于4k,则可以使用:

UPDATE IMS_TEST 
   SET TEST_Category           = 'just testing'  
 WHERE to_char(TEST_SCRIPT)    = 'something'
   AND ID                      = '10000239';

无论如何,通过CLOB进行搜索是很奇怪的。


1
CLOB字段也不能在MINUS操作中使用。
2015年

8
如果你的价值观可能超过4K,您可以用where dbms_lob.compare(testscript,:var2) = 0stackoverflow.com/a/12590223/1845672
罗兰

@Jewels:我有一个404太,然后试图再次联系和它的工作-怪异
伯纳德·保卢斯

只是另一个oracle的奇怪错误消息。在where子句和'expected-got CLOB'的clob用法之间没有任何关系。谢谢你
耶尔马兹

“比较条件”还包括SELECT DISTINCTGROUP BY
迈克

34

这样做时也会发生相同的错误 SELECT DISTINCT ..., <CLOB_column>, ...

如果此CLOB列的所有适用行中的值都小于VARCHAR2的限制,则可以使用to_char(<CLOB_column>)或将多次调用的结果串联起来DBMS_LOB.SUBSTR(<CLOB_column>, ...)


1
也适用于CLOB inGROUP BY子句。相同的原因。:-)
迈克,

12

取CLOB的一个substr,然后将其转换为char:

UPDATE IMS_TEST 
  SET TEST_Category           = 'just testing' 
WHERE to_char(substr(TEST_SCRIPT, 1, 9))    = 'something'
  AND ID                      = '10000239';

1

问题可能在于选择的空值与CLOB类型的列结合使用。

select valueVarchar c1 ,
       valueClob c2 ,
       valueVarchar c3 ,
       valueVvarchar c4
of Table_1
union
select valueVarchar c1 ,
       valueClob c2 ,
       valueVarchar c3 ,
       null c4
of table_2

我重新设计了光标。第一个游标由四个非空列组成。第二个光标选择三个非空列。空值被注入cursorForLoop中。


1

我只是碰到了这一点,偶然发现CLOB可以用于类似的查询中:

   UPDATE IMS_TEST 
   SET TEST_Category  = 'just testing'  
 WHERE TEST_SCRIPT    LIKE '%something%'
   AND ID             = '10000239' 

这对于大于4K的CLOB也有效

性能不会很好,但是就我而言这不是问题。


0

我发现clob在CTE中选择一列会引起爆炸。即

with cte as (
    select
        mytable1.myIntCol,
        mytable2.myClobCol
    from mytable1
    join mytable2 on ...
)
select myIntCol, myClobCol
from cte
where ...

大概是因为oracle无法处理临时表中的Clob。

由于我的值大于4K,因此无法使用to_char()
我的工作是从决赛中选择它select,即

with cte as (
    select
        mytable1.myIntCol
    from mytable1
)
select myIntCol, myClobCol
from cte
join mytable2 on ...
where ...

如果这会导致性能问题,那就太糟糕了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.