oracle ORA-00932:不一致的数据类型:预期-得到CLOB

q3qa4bjr  于 2023-04-20  发布在  Oracle
关注(0)|答案(8)|浏览(296)

考虑到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
gjmwrych

gjmwrych1#

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

zpf6vheq

zpf6vheq2#

一般来说,要解决这个问题,只需使用TO_CHAR,例如将日期转换为'DD/MM/RRR hh 24:mi:ss'格式。

TO_CHAR(date_value ,''DD/MM/RRRR hh24:mi:ss'')
gr8qqesn

gr8qqesn3#

不能在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列搜索?

camsedfj

camsedfj4#

执行SELECT DISTINCT ..., <CLOB_column>, ...时也会出现相同的错误。
如果此CLOB列在所有适用行中包含的值都短于VARCHAR2的限值,则可以使用to_char(<CLOB_column>)或将多次调用DBMS_LOB.SUBSTR(<CLOB_column>, ...)的结果连接起来。

iswrvxsc

iswrvxsc5#

取一个CLOB的substr,然后将其转换为char:

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

g9icjywg6#

我刚刚浏览了这一个,我偶然发现CLOB可以在like查询中使用:

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

这也适用于大于4K的CLOB
表演不会很好,但对我来说没有问题。

rhfm7lfc

rhfm7lfc7#

我发现在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 ...

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

fcy6dtqo

fcy6dtqo8#

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

相关问题