Oracle ORA-00932:不一致的数据类型:应为-已获取CLOB
考虑到Oracle ORA-00932:不一致的数据类型:应为-已获取CLOB,oracle,clob,Oracle,Clob,考虑到TEST\u SCRIPT是一个CLOB为什么在Oracle上从SQL*PLUS运行此简单查询时,会出现以下错误: ORA-00932: inconsistent datatypes: expected - got CLOB 我已经阅读了很多关于同一错误的问题,但是没有一个是运行SQLPLUS的直接查询 UPDATE IMS_TEST SET TEST_Category = 'just testing' WHERE TEST_SCRIPT =
TEST\u 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
不能在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的substr,然后将其转换为字符:
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE to_char(substr(TEST_SCRIPT, 1, 9)) = 'something'
AND ID = '10000239';
在执行
选择DISTINCT…,…
时也会发生相同的错误
如果此CLOB列在所有适用行中包含的值都小于VARCHAR2的限制,则可以使用
来\u char()
或将多个调用的结果连接到DBMS\u LOB.SUBSTR(,…)
,问题可能在于所选的空值与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无法处理临时表中的clob
因为我的值超过4K,所以无法使用来\u char()
我的工作是从最后的
select
,即
with cte as (
select
mytable1.myIntCol
from mytable1
)
select myIntCol, myClobCol
from cte
join mytable2 on ...
where ...
如果这会导致性能问题,那就太糟糕了。在我的例子中,我使用的是EntityFramework,我尝试使用的列名为
value
——即oracle保留的关键字。您的实际脚本是否有您问题中出现的Microsoft卷曲引号?或者这仅仅是创造问题的产物?在实际脚本中,字符串'something'
实际上是否超过4000个字符?对不起,你说的卷曲引号是什么意思?你是说这些引语不是正确的引语吗?本例中的字符串s=就是这样。我可能在实际产品中有更大的字符,但我只是想看看这个简单的查询是否有效。@user1298925,这个查询可以工作,但如果您试图在clob中插入4000多个字符,它将失败field@user1298925-在你发布的问题中,刚刚测试的字符串周围的引号是Microsoft的卷曲引号,
,而不是普通的单引号,
。我在编辑中纠正了这一点,但我不确定这是影响您的原始脚本还是在创建和发布问题的过程中引入的内容。你是说在示例脚本中,字符串实际上只有10个字符长吗?是的,它们实际上只有10个字符长,我确保我的单引号也正确键入。CLOB字段也不能用于减号运算。如果值可能超过4K,则可以使用where dbms_lob.compare(testscript,:var2)=0
see@Jewels:我也得到了一个404,然后再次尝试链接,结果成功了-奇怪的是另一个oracle奇怪的错误消息。where子句上clob的用法与“expected-got clob”之间没有任何关系。顺便说一下,谢谢。“比较条件”还包括SELECT DISTINCT
和groupby
也适用于groupby
子句中的CLOB。同样的原因。:-)