【问题标题】:Oracle: Error when executing queryOracle:执行查询时出错
【发布时间】:2012-07-30 17:41:35
【问题描述】:

我有一个表 SyncTokenLock,其中包含 CLOB 类型的列 lockName。当我从 SQLDeveloper 运行以下查询时 -

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 

知道原因是什么。

【问题讨论】:

  • 似乎错误是因为 Oracle 不允许在 where 子句中使用 CLOB 数据类型。不确定。谁能确认一下。

标签: oracle11g oracle-sqldeveloper hibernate3


【解决方案1】:

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

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

您的专栏真的需要成为 CLOB 吗?您是否期望超过 4000 个字符的值?如果没有,请使用 VARCHAR2。

【讨论】:

  • 即使我不确定是否需要将其设为 CLOB。我有在 PostgreSQL 上运行的遗留代码。我需要添加对 Oracle 的支持。该列被指定为 VARCHAR(4096),因此在为 Oracle 设计模式时使用了 CLOB。截至目前,我将列类型从 CLOB 更改为 VARCHAR2(4000) 以使其工作。不知道那是多么的万无一失。您的解决方案适用于 Oracle,但不适用于 PostgreSQL。我正在使用 hibernate 为 Oracle 和 PostgreSQL 进行数据库通信。
【解决方案2】:

您可以使用like,而不是使用等号:

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

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2018-12-14
    • 2012-11-04
    相关资源
    最近更新 更多