機房收費系統——預存程序的運用,收費系統預存程序
在機房收費系統中的“結賬”部分,要求選中操作員然後點擊“結賬”按鈕後,將該操作員辦理的註冊、充值、退卡業務的狀態改為“已結賬”。註冊、充值和退卡分別記錄在三張表中,如果按照傳統的辦法,需要在DAL層寫三個函數,分別update每張表的isCheck為“true”,且不說寫多少代碼,費多少力氣,這樣還降低了系統的運行速度,容易出錯。
在個人版機房收費系統重構中,我們不是像以前那樣只要功能實現即可,而是變“懶”了,對重複的工作Say No,在這裡就引入了預存程序來解決這個問題。預存程序是使用SQL語句和流程式控制制語句編寫的模組,經編譯和最佳化後儲存在資料庫伺服器端的資料庫中,使用時調用即可。
1.預存程序的建立:
選擇要使用預存程序下的“可程式化性”,點開“+”號選擇"預存程序",右擊在捷徑功能表中選擇"建立預存程序",然後顯示出如下的介面。咋一看有好多代碼,其實就是個模板,我們只需填寫一下。
注意:要在參數後註明資料類型,和資料庫中相應的欄位類型保持一致。
2.使用預存程序的D層代碼:
'結賬後將該使用者操作的業務[儲值,退卡,註冊卡]isCheck改為true Public Function UpdateIsCheck(ecard As Card) As Boolean Implements ICheckOut.UpdateIsCheck Dim sqlHelper As New SqlHelper.sqlHelper '執行個體化sqlHelper類 Dim cmdType As <strong>CommandType</strong> = CommandType.StoredProcedure '定義命令類型,預存程序 <strong>Dim cmdText As String = "PROC_CheckOut" </strong> '資料庫執行字串 '傳參 Dim params As SqlParameter() params = {New SqlParameter("@ischeck", ecard.ProisCheck), New SqlParameter("@userID", ecard.ProuserID)} Return sqlHelper<strong>.ExecuteNoQuery(cmdText, cmdType, params)</strong> End Function
3.使用SQL語句的代碼:
Public Function ModifyPwd(euser As User) As Integer Implements IPwd.ModifyPwd Dim strSQL As String = "update T_User set userPwd =@pwd where userID=@userID" Dim params() As SqlParameter = {New SqlParameter("@pwd", euser.ProuserPwd), New SqlParameter("@userID", euser.ProuserID)} Dim helper As New SqlHelper.sqlHelper Dim result = helper.ExecuteNoQuery(strSQL, CommandType.Text, params) Return result End Function
通過以上對比,發現其實預存程序的使用很簡單,只需更改 CommandType 為StoredProcedure,不用小心翼翼地寫SQL語句,而是換成寫好的預存程序的名稱。
相對於直接使用SQL語句,在應用程式中直接調用預存程序有以下好處:減輕了程式編寫的工作量,降低了網路通訊量。調用一個行數不多的預存程序與直接調用SQL語句的網路通訊量可能不會有很大的差別,可是如果預存程序包含上百行SQL語句,那麼其效能絕對比一條一條的調用SQL語句要高得多。由於在預存程序建立的時候,資料庫已經對其進行了一次解析和最佳化。預存程序一旦執行,在記憶體中就會保留一份這個預存程序,這樣下次再執行同樣的預存程序時,可以從記憶體中直接調用,從而提高了執行速度。同時增強了SQL的功能和靈活性,間接實現安全控制功能。
這是第一次使用預存程序,今後還會不斷地學習和運用。邁出了第一步,前邊的路就好走了。
學校機房收費系統
百度搜尋 網吧管理系統或者機房計費系統,可以發現有好多。
oracle中運用預存程序調用函數
我也來做,以下程式經過測試,正常擷取cost值,插入收銀資訊表正常!!
--建立表
CREATE TABLE member_info(
memberid NUMBER,
memberlevel VARCHAR2(20),
memberdis NUMBER)
;
CREATE TABLE cost_info(
memberid NUMBER,
spend FLOAT,
COST FLOAT)
;
INSERT INTO member_info VALUES(1,'A',0.1);
INSERT INTO member_info VALUES(2,'A',0.2);
INSERT INTO member_info VALUES(3,'A',0.3);
INSERT INTO member_info VALUES(4,'A',0.4);
--建立函數
CREATE OR REPLACE FUNCTION function_mem(p_memeberid member_info.MEMBERID%TYPE,p_spend cost_info.SPEND%TYPE)
RETURN FLOAT
IS
v_cost cost_info.COST%TYPE;
v_memberdis member_info.MEMBERDIS%TYPE;
BEGIN
SELECT memberdis INTO v_memberdis FROM member_info WHERE memberid = p_memeberid;
v_cost := v_memberdis* p_spend;
RETURN v_cost;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END ;
--建立procedure
CREATE OR REPLACE PROCEDURE proc_mem(p_memeberid member_info.MEMBERID%TYPE,p_spend cost_info.SPEND%TYPE)
IS
v_cost cost_info.COST%TYPE;
BEGIN
SELECT function_mem(p_memeberid,p_spend) INTO v_cost FROM dual;
INSERT INTO cost_info VALUES(p_memeberid,p_spend,v_cost);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line(SQLERRM);
END;
----執行procedure
BEGIN
proc_mem(1,1000);
END;...餘下全文>>