2012-08-01 211 views
0

我有一个表SyncTokenLock,它具有CLOB类型的列lockName。当我运行从的SQLDeveloper以下查询 -Oracle:执行查询时出错

select * from SyncTokenLock where 
lockName='com.vmware.horizon.datastore.impl.ProvisioningStateDataServiceImpl'; 

我得到以下情况例外 -

ORA-00932: inconsistent datatypes: expected - got CLOB 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 

时通过Hibernate(3.6.10)针对的Oracle 11g执行此查询,我得到类似的错误。 Hibernate抛出以下异常 -

ORA-00932: inconsistent datatypes: expected - got CLOB 

任何想法可能是什么原因。

+0

看来错误是因为在where子句Oracle不允许'CLOB'数据类型。不确定。有谁可以证实。 – devang 2012-08-01 19:51:02

回答

0

正确,您不能在WHERE子句中使用与CLOB的相等性。但是,你可以这样做:

SELECT * FROM SyncTokenLock 
WHERE dbms_lob.substr(lockName, 100) = 
      'com.vmware.horizon.datastore.impl.ProvisioningStateDataServiceImpl'; 

贵柱真的需要一个CLOB?你期望值超过4000个字符?如果不是,请使用VARCHAR2。

+0

即使我不确定是否需要CLOB。我有在PostgreSQL上运行的遗留代码。我需要添加对Oracle的支持。此列被指定为VARCHAR(4096),因此在为Oracle设计模式时使用了CLOB。截至目前,我已将列类型从CLOB更改为VARCHAR2(4000),以使其工作。不知道这是多么的万无一失。你的解决方案可以对付Oracle,但不会对付PostgreSQL。我正在使用hibernate为Oracle和PostgreSQL进行数据库交谈。 – devang 2012-08-02 05:21:30

0

除了使用等号的,你可以使用like

select * from SyncTokenLock where lockName like 'com.vmware.horizon.datastore.impl.ProvisioningStateDataServiceImpl';