ORA-00932:不一致的数据types:预计 – 得到CLOB

考虑到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 

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

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

如果你的值总是小于4k,你可以使用:

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

无论如何,通过CLOB进行search是很奇怪的。你能不能通过ID列search?

在执行SELECT DISTINCT ..., <CLOB_column>, ...时也会发生同样的错误。

如果此CLOB列在所有适用的行中包含的值小于VARCHAR2的限制,则可以使用to_char(<CLOB_column>)或将多个调用的结果连接到DBMS_LOB.SUBSTR(<CLOB_column>, ...)

取一个CLOB的substr,然后把它转换成char:

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

问题可能在于选定的空值与CLOBtypes的列结合使用。

 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 

我修改了光标。 第一个游标由四个非空列组成。 第二个游标select三个非空列。 null值被注入到cursorForLoop中。