大家都知道在程序中盡量少和數據庫交互是可以 提高程序性能的,以下舉一個比較常見的例子 如:需要根據 某條件判斷條記錄是否存在 如果不存在就 插入的這種操作。 一般都會用 2 次數據庫io , 1次取 Count 如果=0 就 INSERT INTO 其實在 Oracle, 或 SQL Service 等大型數據庫中可以使用批 SQL 語句節省數據庫 IO(和數據庫的交互). 以下例子是一個簡單的的演示執行一次數據庫 io(演示使用C# + Oracle數據庫演示,其他語言或 SQLService 也差不多), 適合使用在寫存儲過程沒太大意義的時候。
測試代碼如下:(注意,測試用的SQL語句中注釋過多會影響性能,實際使用不用這么多注釋) 語句比較簡單,所以沒有把表結構貼出來,數據庫連接部分省略。 //使用批 SQL 執行(但不能換行和回車 \r\n 不行 \n 可以) //C# 可以用 @ 可以直接換行,VB 寫這樣的比較郁悶所以用C# 作演示 const string ExecSQl= @"Declare var_bbsitemid VARCHAR2(12) :=:IpBbsitemid ;/*傳入參數*/ var_userid VARCHAR2(20) := :IpUserid ;/*傳入參數*/ var_counts NUMBER(10); BEGIN /*根據條件取記錄條數*/ SELECT COUNT(t.bbsitemid) INTO var_counts FROM ST_BBSMRKTRSLTCHK t WHERE t.userid = var_userid AND t.bbsitemid = var_bbsitemid;
/* Oracle 打印不知道怎么看 nnd */ Dbms_Output.put_line('Count:'|| var_counts);
/*如果是0條就插入*/ IF var_counts = 0 THEN INSERT INTO ST_BBSMRKTRSLTCHK(BBSITEMID, USERID, READFLG, LASTMODIFIED) VALUES (var_bbsitemid, var_userid, 0, SYSDATE); END IF;
END;" ; //auto --commit; //必須把\r (換行符)去掉 否則 Oracle 不認而且會報錯。 this.cmd.CommandText = ExecSQl.Replace("\r",string.Empty); cmd.Parameters.Clear(); OracleParameter Par; //傳參數 Par = cmd.Parameters.Add(":IpBbsitemid",OracleType.VarChar); Par.Value="0012";
Par = cmd.Parameters.Add(":IpUserid",OracleType.VarChar); Par.Value="DEF";
try { //如果執行批每次返回都是1 如果想得到真正的更新條數就要用Out的 OracleParameter 了
MessageBox.Show("執行成功");
catch(Exception ex) { MessageBox.Show(ex.ToString()); } |
溫馨提示:喜歡本站的話,請收藏一下本站!