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
производительность не будет большой, но это не было проблемой в моем случае.