Oracle:Blob 列抛出不一致的数据类型
Oracle: Blob column throws inconsistent datatypes
我有三个 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_LOGO 列是 BLOB
谁能解释为什么查询只在第三个数据库上抛出异常或者我应该检查什么?
TL;DR: 您需要在第三环境中重建主键。
错误消息具有误导性(Oracle 经常如此),它应该是 'DISTINCT does not work with BLOBs'.
您对 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
这仅在支持索引健康时有效。如果您移动(或重组)table,使索引变得不可用,您会收到错误消息:
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)
奇怪!
我有三个 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_LOGO 列是 BLOB
谁能解释为什么查询只在第三个数据库上抛出异常或者我应该检查什么?
TL;DR: 您需要在第三环境中重建主键。
错误消息具有误导性(Oracle 经常如此),它应该是 'DISTINCT does not work with BLOBs'.
您对 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
这仅在支持索引健康时有效。如果您移动(或重组)table,使索引变得不可用,您会收到错误消息:
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)
奇怪!