考虑到这TEST_SCRIPT就是CLOB 为什么当我从Oracle上的SQL*PLUS运行这个简单的查询时,我得到错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关同一错误的很多问题,但没有一个是从SQLPLUS运行直接查询
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE TEST_SCRIPT = 'something'
AND ID = '10000239'
Run Code Online (Sandbox Code Playgroud)
完整示例:
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
Run Code Online (Sandbox Code Playgroud)
Cra*_*aig 63
您不能将CLOB放在WHERE子句中.从文档:
比较条件不支持大对象(LOB).但是,您可以使用PL/SQL程序来比较CLOB数据.
如果您的值始终小于4k,则可以使用:
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE to_char(TEST_SCRIPT) = 'something'
AND ID = '10000239';
Run Code Online (Sandbox Code Playgroud)
无论如何都要通过CLOB进行搜索很奇怪..你能不能只通过ID列进行搜索?
Fra*_*nič 25
这样做时也会发生同样的错误SELECT DISTINCT ..., <CLOB_column>, ....
如果此CLOB列包含所有适用行中VARCHAR2的限制值,则可以使用to_char(<CLOB_column>)或连接多个调用的结果DBMS_LOB.SUBSTR(<CLOB_column>, ...).
小智 12
获取CLOB的substr,然后将其转换为char:
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE to_char(substr(TEST_SCRIPT, 1, 9)) = 'something'
AND ID = '10000239';
Run Code Online (Sandbox Code Playgroud)
我刚刚浏览了这个,偶然发现 CLOB 可以在类似的查询中使用:
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE TEST_SCRIPT LIKE '%something%'
AND ID = '10000239'
Run Code Online (Sandbox Code Playgroud)
这也适用于大于 4K 的 CLOB
性能不会很好,但对我来说这不是问题。