ORA-00932: 不一致的数据类型: 预期得到的 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
350144 次浏览

不能在 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 来搜索是很奇怪的. . 你能不能不用 ID 列来搜索?

取 CLOB 的一个子串,然后将其转换为一个字符:

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

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

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

问题可能在于选择的空值与 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 中。

我刚刚查看了这个,偶然发现 CLOB 可以用于类似的查询:

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

这也适用于大于4K 的 CLOB

表现不会很好,但对我来说没有问题。

我发现在 CTE 中选择 clob柱引起了这次爆炸

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

大概是因为 Oracle 不能处理临时桌子上的木棍。

因为我的值大于4K,所以不能使用 to_char()
我的工作是从最终的 select中选择它

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

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

在我的例子中,我使用的是 EntityFramework,我试图使用的列名为 value-也就是 Oracle 的保留关键字。