mysql存儲過程在線上用得其實並很少,生產環境也不會大量使用存儲過程mysql
性能比不用存儲過程差一半,msyql存儲過程性能不太好sql
msyql存儲過程出錯了,調試起來並不太容易數據庫
msyql大多數都是在互聯網公司使用的,互聯網公司業務比較簡單不太須要用到存儲過程,其次是在使用msyql的時候會使用到分佈式msyql集羣,目前大部分的分佈式msyql中間件都是不支持存儲過程的,因此msyql的存儲過程和自定義函數用的是很少的安全
存儲在數據庫端的一組SQL語句集網絡
用戶能夠經過存儲過程名和傳參屢次調用的程序模塊分佈式
存儲過程的特色:函數
使用靈活,可使用流程控制語句、自定義變量等完成複雜的業務邏輯性能
提升數據安全性,屏蔽應用程序直接對錶的操做,易於進行審計調試
減小網絡傳輸code
提升代碼維護的複雜度,實際使用中評估場景是否適合
IF 判斷條件
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] [ELSE statement_list] END IF
CASE 判斷條件
CASE case_value WHEN when_value THEN statement_list [ELSE statement_list] END CASE
WHILE 循環
WHILE search_condition DO statement_list END WHILE
REPEAT 循環
REPEAT statement_list UNTIL search_condition END REPEAT
和之前的if不同,之前的叫if函數
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type type: Any valid MySQL data type characteristic: COMMENT 'string' | [NOT] DETERMINISTIC routine_body: Valid SQL routine statement
階乘
CREATE PROCEDURE proc_test1 -- 建立一個存儲過程叫proc_test1 (IN total INT,OUT res INT) -- IN表明傳入參數 total 類型INT,OUT表示傳出參數res 類型INT BEGIN -- 表示代碼塊開始 DECLARE i INT; -- 定義變量i INT類型 SET i = 1; -- 用SET賦值 SET res = 1; -- 用SET賦值 IF total <= 0 THEN -- 若是total小於等於0 SET total = 1; -- 設置total = 1 END IF; WHILE i <= total DO -- 若是i小於等於total SET res = res * i; INSERT INTO tbl_proc_test(num) VALUES (res); SET i = i + 1; END WHILE; END ; -- 表示代碼塊結束
存儲過程使用call調用
delimiter // create procedure procTest() begin select * from a;end; // delimiter ; call procTest();
delimiter // 表示結束符,防止存儲過程當中打了;號就結束了,寫完存儲過程後再把結束符調整回來delimiter ;,固然在msyql workbench中能夠方便的點擊圖形化界面建立存儲過程語句
call proc_test1(10, @res); select @res; -- @res表示存儲過程當中out的那個變量,這樣能夠將它打印出來
最後不建議用。。。