inconsistent datatypes: expected - got CLOB錯誤一例
測試人員反映說有個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也是不負責的,而且這類函數的更改也不會通知使用者。所以要使用這類函數,一定要三思而後行!