inconsistent datatypes: expected - got CLOB錯誤一例

來源:互聯網
上載者:User

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也是不負責的,而且這類函數的更改也不會通知使用者。所以要使用這類函數,一定要三思而後行!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.