77

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

7 回答 7

78

您不能将 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 搜索是很奇怪的。你不能只用 ID 列搜索吗?

于 2012-10-19T18:46:41.443 回答
43

做的时候也会出现同样的错误SELECT DISTINCT ..., <CLOB_column>, ...

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

于 2015-11-20T12:54:53.477 回答
12

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

UPDATE IMS_TEST 
  SET TEST_Category           = 'just testing' 
WHERE to_char(substr(TEST_SCRIPT, 1, 9))    = 'something'
  AND ID                      = '10000239';
于 2015-06-24T19:38:34.693 回答
3

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

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

这也适用于大于 4K 的 CLOB

性能不会很好,但在我的情况下这没问题。

于 2018-01-30T06:20:35.620 回答
2

我发现clob在 CTE 中选择一列会导致这种爆炸。IE

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

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

于 2018-10-29T05:38:42.093 回答
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 中。

于 2015-12-14T11:51:53.417 回答
0

在我的情况下,我使用的是 EntityFramework 并且我尝试使用的列被称为value- 即 oracle 的保留关键字。

于 2021-05-19T08:31:24.793 回答