2012-08-01 65 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';