最近需要連結Oracle的Stored Procedure,遇到了一點問題。
在此記錄~
1. ORA-06550 Stored Procedure Error
它跟我說這個Stored Procedure Name不是個Procedure 或沒有定義。
但去翻資料庫明明就有,莫非是當時鬼門未關?
嚐試了各種換變數皆宣告無效,百思不得其解。
遂參拜Google大神得籤詩一支:籤詩於此
我所連結呼叫的其實不是Stored Procedure,而是一個Function。
雖然Funtion可以用Stored Procedure的方式來呼叫,但是它有一個返回值,而這個返回值需要用一個參數來承接。
詳細程式在文末。
2.ORA-01403 No Data Found Error
在資料庫查有資料,但是程式卻偏偏跑不出來,莫非是當時鬼門未關?
老天保佑,當時我靈光一閃,模糊意識到這個錯誤之前遇過。
仔細對照之後發現,該呼叫的Function一共三個參數,後面兩個參數有預設值可不傳。
為求方便,我便沒傳參數進去,誰料Oracle對參數設定異常嚴格。
若沒有設定cmd.BindByName,就死死的照順序給參數。
參數不對,結果當然出不來,設定之後解決。
P.S 型態錯誤也會造成這個錯誤:參考連結
3.ORA-06502: PL/SQL: Numeric or Value Error: Character String Buffer Too Small
單看字面意思是參數容量太小,不過我也懷疑是型態錯誤,但也有可能是當時鬼門未關?
懶得一一嚐試,於是再度參拜Google大神,再得籤詩一隻:籤詩於此
設定返回值size之後,成功解決。
順道記錄一下,返回值是一個DataTable的話,在C#要怎麼接?
var myReader = ((OracleRefCursor)myOracleCmd.Parameters["o_result_cur"].Value).GetDataReader();
dtCompany.Load(myReader);
4. ORA-00911: Invalid Character
執行的時候報了一個錯誤,但是該SQL拿到SQL Developer裡又可以跑。
單看字面訊息,可能的錯誤多到枚不勝數。
這不用說一定是當時鬼門未關的關係!
參拜之後發現原來是「;」的問題。奇也怪哉,C#的SQL語句竟然不能加分號。
刪掉分號之後順利解決,可喜可賀。
----------------------------------------------
今日Google大神又再度拯救了世界,阿彌陀佛~
0 comments:
張貼留言