Oracle 动态SQL语句(4)之存储过程的调用与浅谈字符串的使用

    在开发的过程中用编程语言调用存储过程时,一定要注意调用存储过程中参数的个数、类型与名称相匹配。

例子如下:

 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;
原文地址:https://www.cnblogs.com/wylaok/p/2754800.html