考虑到 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
6 回答
您不能将CLOB放在WHERE子句中 . 来自documentation:
如果您的值始终小于4k,则可以使用:
无论如何都要通过CLOB进行搜索很奇怪..你能不能只通过ID列进行搜索?
在执行
SELECT DISTINCT ..., <CLOB_column>, ...
时也会发生同样的错误 .如果此CLOB列包含的值小于所有适用行中VARCHAR2的限制,则可以使用
to_char(<CLOB_column>)
或将多个调用的结果连接到DBMS_LOB.SUBSTR(<CLOB_column>, ...)
.获取CLOB的substr,然后将其转换为char:
问题可能在于选定的空值与CLOB类型列的组合 .
我重写了光标 . 第一个游标由四个非空列组成 . 第二个游标选择三个非空列 . 将null值注入cursorForLoop .
我刚刚跑过这个,我偶然发现CLOB可以用在类似的查询中:
这也适用于大于4K的CLOB
性能不会很好,但在我的情况下这没问题 .
我发现在CTE中选择一个
clob
列导致了这次爆炸 . 即大概是因为oracle无法处理临时表中的clob .
因为我的值超过4K,所以我无法使用
to_char()
.我的工作是从最终
select
中选择它,即如果这会导致性能问题,那就太糟糕了 .