初識MySQL存儲過程
存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。
MySQL 存儲過程是從 MySQL 5.0 開始增加的新功能。大大提高數據庫的處理速度,同時也可以提高數據庫編程的靈活性。
過程:封裝起來的若干條語句,調用時這些封裝體執行。把此過程存儲到數據庫中即存儲過程.
函數:是一個有返回值的“過程”。
過程:沒有返回值的函數。
存儲過程的優點:
1、存儲過程增強了SQL語言的功能和靈活性(可以SQL編程,能使用變量,表達式、控制結構體)
2、存儲過程能實現較快的執行速度。(存儲過程要比批處理的執行速度快很多,因為存儲過程是預編譯的。在首次運行一個存儲過程時查詢,優化器對其進行分析優化,並且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優化,速度相對要慢一些。)
3、存儲過程能過減少網絡流量。針對同一個數據庫對象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,從而大大增加了網絡流量並降低了網絡負載。
4、存儲過程可被作為一種安全機制來充分利用。系統管理員通過執行某一存儲過程的權限進行限制,能夠實現對相應的數據的訪問權限的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。
5、存儲過程允許標准組件是編程。存儲過程被創建後,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,對應用程序源代碼毫無影響。
存儲過程的創建:
DELIMITER $$ //定義分隔符
CREATE PROCEDURE p() //p為過程名
BEGIN
--sql語句 //封裝語句體
END $$
查看已有的存儲過程:show procedure status \G;
調用存儲過程:call 存儲過程名稱();
刪除存儲過程:drop procedure 存儲過程名稱;
變量聲明:存儲過程中用declare聲明變量
格式:declare 變量名 變量類型 [default 默認值]
存儲過程中,變量可以在SQL語句中合法的運算,如+ - * /
運算結果如何賦值 set 變量 := 表達式
存儲過程傳參:存儲過程的括號裡,可以聲明參數。 語法是 create procedure p([in/out/inout] 參數名 參數類型 ..)
in out inout詳細分析見下一篇博文(鏈接下午放出)
實例一:創建 運算 賦值
CREATE PROCEDURE p1()
BEGIN
DECLARE age INT DEFAULT 18;
DECLARE height INT DEFAULT 180;
SET age := age +20;
SELECT CONCAT('年齡是', age, '身高是', height);
END$$
實例二 :if/else 控制結構
CREATE PROCEDURE p2()
BEGIN
DECLARE age INT DEFAULT 18;
DECLARE height INT DEFAULT 180;
IF age >= 18 THEN
SELECT "已成年";
ELSE
SELECT "未成年";
END IF;
END$$
實例三:while/do 控制結構
求1-100的和
CREATE PROCEDURE p3()
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 0;
WHILE num<=100 DO
SET total := num + total;
SET num := num + 1;
END WHILE;
SELECT total;
END$$
實例四:case 控制結構
CREATE PROCEDURE p4()
BEGIN
DECLARE num INT DEFAULT 0;
SET num := FLOOR(4*RAND());
CASE num
WHEN 1 THEN SELECT "cat";
WHEN 2 THEN SELECT "dog";
WHEN 3 THEN SELECT "sheep";
ELSE SELECT "pig";
END CASE;
END$$
實例五:repeat循環
CREATE PROCEDURE p5()
BEGIN
DECLARE num INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
REPEAT
SET total = num + total;
SET num := num + 1;
UNTIL num>100 END REPEAT;
SELECT total;
END$$