在開發的過程中用編程語言調用存儲過程時,一定要注意調用存儲過程中參數的個數、類型與名稱相匹配。
例子如下:
public void Store() { // HaveTime = EndTime.CompareTo(StartTime); TimeSpan timeSp = new TimeSpan(); timeSp = EndTime - StartTime; HaveTime = Convert.ToInt64(timeSp.TotalSeconds); OracleParameter[] parms ={ new OracleParameter("I_ID",OracleType.NVarChar), new OracleParameter("I_STARTTIME",OracleType.NVarChar), new OracleParameter("I_ENDTIME",OracleType.NVarChar), new OracleParameter("I_HAVETIME",OracleType.Number), new OracleParameter("I_MAXTIME",OracleType.NVarChar), new OracleParameter("I_MAXV",OracleType.Double), new OracleParameter("I_AVGV",OracleType.Double), new OracleParameter("I_MINV",OracleType.Double), new OracleParameter("I_CUOSHI",OracleType.NVarChar), new OracleParameter("I_BY",OracleType.NVarChar) }; parms[0].Value = SensorID.ToString(); parms[1].Value = StartTime.ToString(); parms[2].Value = EndTime.ToString(); parms[3].Value = HaveTime;//HaveTime parms[4].Value = MaxTime.ToString(); parms[5].Value = MaxV;//0 parms[6].Value = AvgV;//0 parms[7].Value = MinV;//0 parms[8].Value = CuoShi; parms[9].Value = WarnBy; OracleHelper.ExecuteNonQuery(OracleHelper.connectionString, CommandType.StoredProcedure, "SP_INSERT_WARN", parms); }
存儲過程如下:
create or replace procedure sp_insert_warn(i_id in nvarchar2, i_starttime in nvarchar2, i_endtime in nvarchar2, i_havetime in number, i_maxtime in nvarchar2, i_maxv in BINARY_DOUBLE, i_avgv in BINARY_DOUBLE, i_minv in BINARY_DOUBLE, i_cuoshi in nvarchar2, i_by in nvarchar2) authid current_user as /******************************** 名稱:sp_update_openclose 功能描述:插入一條新的報警記錄 修訂記錄: 版本號 編輯時間 編輯人 修改描述 1.0.0 2012-10-09 王玉剛 1.創建此存儲過程 注釋 入參出參描述: i_id 測點編號 i_starttime 開始時間 i_endtime 結束時間 i_havetime 持續時間 i_maxtime 最大值出現的時間 i_maxv 最大值 i_avgv 平均值 i_minv 最小值 i_cuoshi 措施 i_by 備注信息 *********************************/ begin INSERT INTO warn VALUES(i_id,to_date(i_starttime,'yyyy-mm-dd hh24-mi-ss'),to_date(i_endtime,'yyyy-mm-dd hh24-mi-ss'), i_havetime,to_date(i_maxtime,'yyyy-mm-dd hh24-mi-ss'),i_maxv,i_avgv,i_minv,i_cuoshi,i_by); commit;--數據更新到表中 end sp_insert_warn ;
在我用C#語言調用存儲過程中因為最大值參數i_maxv寫成了i_mavv調用就出現了錯誤。
當把存儲過程中輸入的字符類型改為NVARCHAR2時,直接執行動態SQL語句出現錯誤,必須定義一個中間字符串才行(VARCHAR2類型)。
如下列PL/SQL代碼:
v_sql_statement varchar2(500);--執行的SQL語句 v_sql_statement:='UPDATE '||v_tablename||' SET MIN05='||i_min05||',AVG05='||i_avg05||',MAX05='||i_max05||' ,MINHOUR='||i_minhour||',AVGHOUR='||i_avghour||',MAXHOUR='||i_maxhour||' ,MAXTIME=to_date('''||i_maxtime||''',''yyyy-mm-dd hh24-mi-ss'') ,MINTIME=to_date('''||i_mintime||''',''yyyy-mm-dd hh24-mi-ss'') WHERE DATETIME=to_date('''||i_realtime||''',''yyyy-mm-dd hh24-mi-ss'')'; execute immediate v_sql_statement;