存儲常式是存儲在資料庫伺服器中的一組sql語句,通過在查詢中調用一個指定的名稱來執行這些sql語句命令. 簡介 SQL語句需要先編譯然後執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過 ...
存儲常式是存儲在資料庫伺服器中的一組sql語句,通過在查詢中調用一個指定的名稱來執行這些sql語句命令.
簡介
SQL語句需要先編譯然後執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。
存儲過程是可編程的函數,在資料庫中創建並保存,可以由SQL語句和控制結構組成。當想要在不同的應用程式或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有用的。資料庫中的存儲過程可以看做是對編程中面向對象方法的模擬,它允許控制數據的訪問方式。
存儲過程的優點:
(1).增強SQL語言的功能和靈活性:存儲過程可以用控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。
(2).標準組件式編程:存儲過程被創建後,可以在程式中被多次調用,而不必重新編寫該存儲過程的SQL語句。而且資料庫專業人員可以隨時對存儲過程進行修改,對應用程式源代碼毫無影響。
(3).較快的執行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多。因為存儲過程是預編譯的。在首次運行一個存儲過程時查詢,優化器對其進行分析優化,並且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優化,速度相對要慢一些。
(4).減少網路流量:針對同一個資料庫對象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織進存儲過程,那麼當在客戶電腦上調用該存儲過程時,網路中傳送的只是該調用語句,從而大大減少網路流量並降低了網路負載。
(5).作為一種安全機制來充分利用:通過對執行某一存儲過程的許可權進行限制,能夠實現對相應的數據的訪問許可權的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。
存儲過程分為有參和無參
過程體
過程體的開始與結束使用BEGIN與END進行標識。
無參存儲過程:
DELIMITER ;; CREATE PROCEDURE `select_students_count`() BEGIN SELECT count(id) from students; END;; DELIMITER ; call select_students_count();
有參存儲過程:
MySQL支持IN(傳遞給存儲過程),OUT(從存儲過程傳出)和INOUT(對存儲過程傳入和傳出)類型的參數。存儲過程的代碼位於BEGIN和END語句內,如前所見,它們是一系列SELECT語句,用來檢索值,然後保存到相應的變數(通過指定INTO關鍵字)
存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT
IN:僅帶入參的存儲過程
參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為預設值
DELIMITER // CREATE PROCEDURE in_param(IN p_in int) BEGIN SELECT p_in; SET p_in=2; SELECT p_in; END; // DELIMITER ; #調用 SET @p_in=1; CALL in_param(@p_in); SELECT @p_in;
OUT:僅帶出參的存儲過程
該值可在存儲過程內部被改變,並可返回
#存儲過程OUT參數 DELIMITER // CREATE PROCEDURE out_param(OUT p_out int) BEGIN SELECT p_out; SET p_out=2; SELECT p_out; END; // DELIMITER ; #調用 SET @p_out=1; CALL out_param(@p_out); SELECT @p_out;
INOUT:帶入參和出參的存儲過程
調用時指定,並且可被改變和返回
#存儲過程INOUT參數 DELIMITER // CREATE PROCEDURE inout_param(INOUT p_inout int) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END; // DELIMITER ; #調用 SET @p_inout=1; CALL inout_param(@p_inout) ; SELECT @p_inout;