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

Posted

技术标签:

【中文标题】ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB【英文标题】:ORA-00932: inconsistent datatypes: expected - got CLOB 【发布时间】:2012-10-19 18:10:55 【问题描述】:

考虑到TEST_SCRIPTCLOB,为什么当我在 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

【问题讨论】:

您的实际脚本是否包含问题中出现的 Microsoft 大引号?或者这仅仅是创造问题的产物?在实际的脚本中,字符串'something'实际上是否长于4000个字符? 对不起,你说的大引号是什么意思?您是否建议引号不是正确的引号?这个例子中的字符串 s= 就是这样。我可能在实际产品中有更大的字符串,但我只是想看看这个简单的查询是否有效。 @user1298925,此查询可以使用,但如果您尝试在 clob 字段中插入超过 4000 个字符,它将失败 @user1298925 - 在您发布的问题中,字符串 just testing 周围的引号是 Microsoft 大引号 ,而不是普通的单引号 '。我在编辑中更正了这一点,但我不确定这是否会影响您的原始脚本或在创建和发布问题的过程中引入的内容。您是说示例脚本中的字符串实际上只有 10 个字符长吗? 是的,它们实际上只有 10 个字符,我确保我的单引号也输入正确。 【参考方案1】:

您不能将 CLOB 放在 WHERE 子句中。来自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 列搜索吗?

【讨论】:

CLOB 字段也不能用于 MINUS 操作。 如果您的值可能超过 4K,您可以使用 where dbms_lob.compare(testscript,:var2) = 0 参见 ***.com/a/12590223/1845672 @Jewels :我也得到了 404,然后再次尝试链接并且它起作用了 - 奇怪 只是另一个 oracle 的奇怪错误消息。在 where 子句中使用 clob 和“预期 - 得到 CLOB”之间没有任何关系。顺便谢谢你。 “比较条件”还包括SELECT DISTINCTGROUP BY【参考方案2】:

SELECT DISTINCT ..., <CLOB_column>, ... 也会出现同样的错误。

如果此 CLOB 列在所有适用行中包含短于 VARCHAR2 限制的值,您可以使用 to_char(<CLOB_column>) 或连接多次调用 DBMS_LOB.SUBSTR(<CLOB_column>, ...) 的结果。

【讨论】:

也适用于GROUP BY 子句中的CLOB。同样的原因。 :-)【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我刚刚跑过这个,偶然发现CLOBs可以用在like query中:

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

这也适用于大于 4K 的 CLOB

性能不会很好,但对我来说没问题。

【讨论】:

您可以在没有% 通配符的情况下使用 LIKE。这确保您只匹配精确值(并且应该更快,但我不知道它是否真的在实践中)。 WHERE TEST_SCRIPT LIKE 'something'【参考方案5】:

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

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

【讨论】:

【参考方案7】:

就我而言,我使用的是 EntityFramework,我尝试使用的列名为 value - 即 oracle 的保留关键字。

【讨论】:

以上是关于ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB的主要内容,如果未能解决你的问题,请参考以下文章

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

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

ora-00932 不一致的数据类型预期数字得到 char plsql

ORA-00932: 不一致的数据类型: 预期 - 得到 clob 休眠/弹簧启动

无法选择 *(ORA-00932:不一致的数据类型:预期的 CHAR 得到了 ADT)

查找错误 ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER