MySQL 存儲過程入門 (一)

概述

MySQL 5.0 版本開始支持存儲過程。

存儲過程(Stored Procedure)是一種在數據庫中存儲複雜程序,以便外部程序調用的一種數據庫對象。

存儲過程是爲了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行。

存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。

優點

  • 存儲過程可封裝,並隱藏複雜的商業邏輯。
  • 存儲過程可以回傳值,並可以接受參數。
  • 存儲過程無法使用 SELECT 指令來運行,因爲它是子程序,與查看錶,數據表或用戶定義函數不同。
  • 存儲過程可以用在數據檢驗,強制實行商業邏輯等。

缺點

  • 存儲過程,往往定製化於特定的數據庫上,因爲支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的存儲過程。
  • 存儲過程的性能調校與撰寫,受限於各種數據庫系統。

一、存儲過程的創建和調用

  • 存儲過程就是具有名字的一段代碼,用來完成一個特定的功能。
  • 創建的存儲過程保存在數據庫的數據字典中。

創建存儲過程

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
 
characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
 
routine_body:
  Valid SQL routine statement
 
[begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

MYSQL 存儲過程中的關鍵語法

聲明語句結束符,可以自定義:

DELIMITER $$
或
DELIMITER //

聲明存儲過程:

create procedure demo_in_parameter(in p_in int)

存儲過程開始和結束符號:

BEGIN .... END   

變量賦值:

set @p_int=1

變量定義:

dealare 1_int int unsigned default 400000;

創建mysql存儲過程、存儲函數:

create procedure 存儲過程名(參數)

存儲過程體:

create function 存儲函數名(參數)

實例

創建數據庫,備份數據表用於示例操作:

-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`192.168.100.12` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
    #Routine body goes here...

    DECLARE c int;
    if a is null then set a = 0; 
    end if;
  
    if b is null then set b = 0;
    end if;

    set sum  = a + b;
END
;;
DELIMITER ;

執行以上存儲結果,驗證是否正確,如下圖,結果OK:

或者可以將 可以給  a ,b 兩個變量賦值

存儲過程的控制語句

IF語句:

​
-- ----------------------------
-- Procedure structure for `proc_if`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_if`;
DELIMITER ;;
CREATE DEFINER=`root`@`192.168.100.12` PROCEDURE `proc_if`(IN type int)
BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    IF type = 0 THEN
        set c = 'param is 0';
    ELSEIF type = 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END IF;
    select c;
END
;;
DELIMITER ;

​

 

CASE語句:

-- ----------------------------
-- Procedure structure for `proc_case`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_case`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)
BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    CASE type
    WHEN 0 THEN
        set c = 'param is 0';
    WHEN 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END CASE;
    select c;
END
;;
DELIMITER ;

循環while語句:

-- ----------------------------
-- Procedure structure for `proc_while`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_while`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)
BEGIN
    #Routine body goes here...
    DECLARE i int;
    DECLARE s int;
    SET i = 0;
    SET s = 0;
    WHILE i <= n DO
        set s = s + i;
        set i = i + 1;
    END WHILE;
    SELECT s;
END
;;
DELIMITER ;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章