考虑到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
答案 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 的保留关键字。