mysql筆記 - 存儲過程與自定義函數

mysql筆記 - 存儲過程與自定義函數

問題

mysql存儲過程在線上用得其實並很少,生產環境也不會大量使用存儲過程mysql

  1. 性能比不用存儲過程差一半,msyql存儲過程性能不太好sql

  2. msyql存儲過程出錯了,調試起來並不太容易數據庫

  3. 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的那個變量,這樣能夠將它打印出來

最後不建議用。。。

相關文章
相關標籤/搜索