Oracle: столбец Blob выдает несогласованные типы данных - PullRequest
1 голос
/ 05 мая 2020

У меня есть три среды oracle и запрос, который успешно выполняется в двух средах, но выдает ORA-00932: inconsistent datatypes: expected - got BLOB в третьей среде.

Запрос

select
        distinct mytable.ID as ID1_130_,
        mytable.CODE as CODE2_130_,
        mytable.MY_LOGO as PRIMARY_8_130_,
    from
        MY_TABLE mytable;

MY_LO GO столбец BLOB

Может ли кто-нибудь объяснить, почему запрос вызывает исключение только в третьей базе данных или что я должен проверить?

1 Ответ

1 голос
/ 05 мая 2020

TL; DR: вам необходимо перестроить первичный ключ в третьей среде.

Сообщение об ошибке вводит в заблуждение (как это часто бывает с Oracle), оно должно быть 'DISTINCT действительно не работает с BLOB'ами '.

Ваш намек Магнусу Йоханссону был правильным, это статус первичного ключа. Вот минимальный пример:

CREATE TABLE t (id NUMBER CONSTRAINT pk PRIMARY KEY, b BLOB);
INSERT INTO t VALUES (1, EMPTY_BLOB());

SELECT DISTINCT работает, пока также выбран первичный ключ. Возможно, с logi c, что, если задействован первичный ключ, остальные столбцы, включая BLOB, тоже будут отличаться:

SELECT DISTINCT id, b FROM t;
1 (BLOB)

SELECT DISTINCT b FROM t;
ORA-00932: inconsistent datatypes: expected - got BLOB

Это работает только до тех пор, пока поддерживается index здоровый. Если вы переместите (или реструктурируете) таблицу так, что индекс станет непригодным для использования, вы получите сообщение об общей ошибке:

ALTER TABLE t MOVE;
SELECT status from USER_INDEXES WHERE index_name='PK';
UNUSABLE

SELECT DISTINCT id, b FROM t;
ORA-00932: inconsistent datatypes: expected - got BLOB

После восстановления индекса он снова работает:

ALTER INDEX pk REBUILD;
SELECT status from USER_INDEXES WHERE index_name='PK';
VALID

SELECT DISTINCT id, b FROM t;
1 (BLOB)

Странно!

...