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

时间:2012-10-19 18:10:56

标签: oracle clob

考虑到TEST_SCRIPTCLOB为什么当我从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

7 个答案:

答案 0 :(得分:58)

您不能在WHERE子句中放置CLOB。来自documentation

  

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

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

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

通过CLOB搜索很奇怪..你能不能只通过ID栏搜索?

答案 1 :(得分:23)

执行SELECT DISTINCT ..., <CLOB_column>, ...时也会出现同样的错误。

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

答案 2 :(得分:11)

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

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

答案 3 :(得分: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

我重写了光标。 第一个游标由四个非空列组成。 第二个游标选择三个非空列。 null值被注入到cursorForLoop。

答案 4 :(得分:0)

我刚试过这个,我偶然发现CLOB可以用在类似的查询中:

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

这也适用于大于4K的CLOB

表演不会很好,但在我的情况下这不是问题。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

就我而言,我使用的是 EntityFramework,我尝试使用的列名为 value - 即 oracle 的保留关键字。