• 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;
  • 相关阅读:
    AJAX下载,安装及使用(转)
    Vss命令行获取文件
    提升MOSS中运行权限
    数据库还原状态监控(查看事件查看器)
    MOSS常用部署命令stsadm (转)
    Linux系统常用命令
    VSTO Outlook 项目和文件夹的编程示例
    135 、137、139端口等主要用途
    WF编程 InvokeWebServiceActivity
    SQLSERVER2005 建立链接服务器
  • 原文地址:https://www.cnblogs.com/wylaok/p/2754800.html
Copyright © 2020-2023  润新知