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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM