inconsistent datatypes: expected - got CLOB錯誤一例

Jet_Zhang發表於2015-05-12

測試人員反映說有個SQL在其中一個測試環境能正常執行,但在另一個測試環境卻無法執行,錯誤為:

ORA-00932: inconsistent datatypes: expected - got CLOB

開始懷疑是不是表中有CLOB欄位導致,但是檢視了一下相關的表結構,沒有CLOB、BLOB等型別的欄位。接著分析SQL,有個地方引起了我的注意,在這個SQL中,使用的WMSYS.WM_CONCAT這個函式。分別在兩個測試環境檢視這個函式的定義,發現了區別:
執行正確的庫的WM_CONCAT定義:

SQL> desc wmsys.wm_concat FUNCTION wmsys.wm_concat RETURNS VARCHAR2  Argument Name                  Type                    In/Out Default?  ------------------------------ ----------------------- ------ --------  P1                             VARCHAR2                IN

 
執行異常的庫的WM_CONCAT定義:

SQL> desc wmsys.wm_concat FUNCTION wmsys.wm_concat RETURNS CLOB  Argument Name                  Type                    In/Out Default?  ------------------------------ ----------------------- ------ --------  P1                             VARCHAR2                IN

這兩個函式的返回值是不一樣的!執行錯誤的庫返回CLOB,難怪會報inconsistent datatypes: expected - got CLOB的錯誤。但是為什麼會這樣呢?上metalink找找答案看。
用WM_CONCAT作為關鍵字搜尋,真搜到了這麼一篇文章[ID 1300595.1],對此問題作出了詳細說明。Oracle的解釋是WM_CONCAT是Workspace Manager中的一個內部函式,可能會隨著資料庫版本的不同函式也會不同。在10.2.0.4/11.1.0.7/11.2.0.1中WM_CONCAT返回的是VARCHAR2,而在10.2.0.5/11.2.0.2中返回值為CLOB。所以兩個庫的函式定義不同也就可以理解了。所以Oracle是不建議使用WM_CONCAT這類內部函式(internal undocumentd function)的,而且對由於使用這類函式所導致的損失,Oracle也是不負責的,而且這類函式的更改也不會通知使用者。所以要使用這類函式,一定要三思而後行!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13885898/viewspace-1651554/,如需轉載,請註明出處,否則將追究法律責任。

相關文章