ORA-00932: несогласованные типы данных: ожидаемый-полученный CLOB

учитывая, что TEST_SCRIPT - это CLOB Почему, когда я запускаю этот простой запрос из SQL * PLUS на Oracle, я получаю ошибку:

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

5 ответов


вы не можете поместить CLOB в предложение WHERE. От документация:

большие объекты (поля) не поддерживаются в условиях сравнения. Однако для сравнения данных CLOB можно использовать программы PL/SQL.

Если ваши значения всегда меньше 4k, вы можете использовать:

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

странно искать с помощью CLOB в любом случае.. не могли бы вы просто искать по столбцу ID?


та же ошибка возникает и при выполнении SELECT DISTINCT ..., <CLOB_column>, ....

Если этот столбец CLOB содержит значения короче, чем limit для VARCHAR2 во всех применимых строках, которые вы можете использовать to_char(<CLOB_column>) или объединить результаты нескольких вызовов DBMS_LOB.SUBSTR(<CLOB_column>, ...).


возьмите substr CLOB, а затем преобразуйте его в char:

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

проблема может заключаться в выбранных нулевых значениях в сочетании со столбцом типа 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 .


Я просто пробежал по этому, и я случайно обнаружил, что CLOBs можно использовать в подобном запросе:

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

это работало также для CLOBs больше, чем 4K

производительность не будет большой, но это не было проблемой в моем случае.