在开发的过程中用编程语言调用存储过程时,一定要注意调用存储过程中参数的个数、类型与名称相匹配。
例子如下:
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;