真是太鬱悶了, 鬱悶了我多半天。
事情從以前寫的自訂函數講起:
create or replace function f_getWorkdays(dayBegin in Date, dayEnd in Date)return numberis。。。end f_getWorkdays;
今天我要在OleDbCommand 中,執行SQL語句:(其實實際比這個複雜,還有參數一類的)
select oauser.f_getworkdays(to_date('2010-9-1','yyyy-hh24-dd'), sysdate) from sys.dual
結果報錯:
System.ArgumentException: 十進位位元組數組建構函式需要一個包含有效十進位位元組且長度為 4 的數組。
因為原來有參數,還曾報過:
System.Data.OleDb.OleDbException: 存取器不是參數存取器。
甚至懷疑OleDb不能調用自訂函數。 轉戰成視圖,把自訂函數放在Oracle視圖中, 無果,一樣的錯誤。
又懷疑是許可權, Grant 一系統許可權。
後來, 在朋友的建議下改成 預存程序:
create or replace package CompanyDeptAlermPackage istype t_ResultSet is ref cursor;procedure usp_getCompanyDeptAlerm(companyDeptId in number, io_cursor in out t_ResultSet);end CompanyDeptAlermPackage;。。。 包體實現省略。
然後又面臨著OleDb調用返回結果集的預存程序的問題, 參數微軟文章:
http://support.microsoft.com/default.aspx?scid=kb;en-us;309361
結果一直報錯:
System.Data.OleDb.OleDbException: ORA-06550: line 1, column 58:
PLS-00201: identifier 'IO_CURSOR' must be declared
幾乎絕望, 後來突發奇想, 難道是 decimal 精度問題?馬上奔回電腦前,改SQL為:
select trunc(oauser.f_getworkdays(to_date('2010-9-1','yyyy-hh24-dd'), sysdate),2) from sys.dual
大吉。 天呀, 嗚呼。