首页 文章

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

提问于
浏览
50

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

6 回答

  • 9

    您不能将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列进行搜索?

  • 1

    在执行 SELECT DISTINCT ..., <CLOB_column>, ... 时也会发生同样的错误 .

    如果此CLOB列包含的值小于所有适用行中VARCHAR2的限制,则可以使用 to_char(<CLOB_column>) 或将多个调用的结果连接到 DBMS_LOB.SUBSTR(<CLOB_column>, ...) .

  • 0

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

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

    问题可能在于选定的空值与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 .

  • 22

    我刚刚跑过这个,我偶然发现CLOB可以用在类似的查询中:

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

    这也适用于大于4K的CLOB

    性能不会很好,但在我的情况下这没问题 .

  • 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 ...
    

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

相关问题