Database Oracle:Blob列抛出不一致的数据类型

Database Oracle:Blob列抛出不一致的数据类型,database,oracle,blob,distinct,Database,Oracle,Blob,Distinct,我有三个oracle环境,一个查询在两个环境中成功运行,但在第三个环境中抛出ORA-00932:inconsistent datatypes:expected-get BLOB 询问 select distinct mytable.ID as ID1_130_, mytable.CODE as CODE2_130_, mytable.MY_LOGO as PRIMARY_8_130_, from MY_TABLE mytab

我有三个oracle环境,一个查询在两个环境中成功运行,但在第三个环境中抛出
ORA-00932:inconsistent datatypes:expected-get 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_徽标列是BLOB


有人能解释为什么查询只在第三个数据库上抛出异常,或者我应该检查什么吗?

TL;DR:您需要在第三个环境中重建主键

错误消息具有误导性(与Oracle一样常见),应该是“DISTINCT不适用于Blob”

你对Magnus Johansson的提示是正确的,这是主键的状态。下面是一个简单的例子:

CREATE TABLE t (id NUMBER CONSTRAINT pk PRIMARY KEY, b BLOB);
INSERT INTO t VALUES (1, EMPTY_BLOB());
SELECT DISTINCT
只要也选择了主键,就可以工作。可能的逻辑是,如果涉及主键,则其他列(包括BLOB)也保证是不同的:

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

SELECT DISTINCT b FROM t;
ORA-00932: inconsistent datatypes: expected - got BLOB
这只在支持索引为healty时有效。如果移动(或重新构造)表,使索引变得不可用,则会收到omnious错误消息:

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)

奇怪

您不能将BLOB列与
DISTINCT
一起使用,但它在其他环境中可以正常工作?那么,该列在其他环境中不是BLOB。该列在所有环境中都不是BLOB,并且它在第三个环境中工作,然后突然停止工作。很明显,你在马格纳斯的博客中找到了答案。最好的方法是你发布一个答案,这样其他用户就可以分享。理想情况下,您可以通过在三个环境中查找查询结果来验证Magnus怀疑:
SELECT constraint_type,status,validated FROM alL_constraint,其中table_name='MYTABLE'并将其包含在您的答案中。