1. 程式人生 > >MySQL5.7從入門到精通-------儲存過程與儲存函式(3)

MySQL5.7從入門到精通-------儲存過程與儲存函式(3)

10.2.1  呼叫儲存過程

        儲存過程必須使用CALL語句來呼叫。如果要呼叫其它資料庫的儲存過程,需要指定資料庫名稱。例如 CALL dbname.spname

DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student
(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  age  INT(11),
  address VARCHAR(255),
  sex  CHAR(2)
);

INSERT INTO t_student VALUES(NULL,'大宇',22,'蘇州','男');
INSERT INTO t_student VALUES(NULL,'小宇',20,'鹽城','男');
INSERT INTO t_student VALUES(NULL,'小雨',20,'鹽城','女');

 

DELIMITER //  --儲存過程分隔符設定為//
CREATE PROCEDURE CountStu(IN stu_sex CHAR,OUT num INT)  --stu_sex表示輸入,num表示輸出
BEGIN 
   SELECT COUNT(*) INTO num FROM t_student WHERE sex = stu_sex; --結果存入num,條件用上變數
END //        --以指定分隔符結束儲存過程
DELIMITER ;   --儲存過程分隔符設定為;
CALL CountStu('男',@num);
SELECT @num;

-- 本質為執行下面的SQL:

SELECT COUNT(*) AS @num 
FROM t_student WHERE sex = '男';

  

CALL CountStu('女',@num);
SELECT @num;

  

        嘗試傳入的其它的資料

CALL CountStu('3',@num);
SELECT @num;

           

撥雲見日

        原來,儲存過程並不是什麼神祕的東西。它只是將SQL語句抽取出來,定義成模版,並定義接收條件引數。在下次要使用這些SQL的時候,傳入我們需要的引數。其實就像Java一樣,定義一個方法。

        再回頭來看最初的儲存過程的定義:儲存過程就是一條或者多條SQL語句的集合。

        現在可以理解為什麼要用儲存過程。如果我們要做測試資料,需要往表裡面批量插入1000條資料。不可能手動輸入1000次INSERT語句,這個時候,就能用的上儲存過程。另外,當我們需要根據不同的條件去查詢指定表裡面的資料的時候,也可以預定義一些儲存過程。這樣,根據不同的條件,我們就能快速的獲取到查詢結果了。

10.2.2  呼叫儲存函式

        儲存函式不需要使用CALL關鍵字。另外,儲存函式的引數型別預設為IN輸入。

DELIMITER //
CREATE FUNCTION countStu2(stu_sex CHAR) -- 預設是IN,OUT、INOUT不支援。效果是IN,但是不能加上IN
RETURNS INT
RETURN  (SELECT COUNT(*) FROM t_student WHERE sex = stu_sex) // -- 不加結束標記,執行失敗
DELIMITER ;
SELECT countStu2('男');

 

        雖然儲存函式與儲存過程的定義稍有不同,但是可以實現相同的功能,應該靈活選擇。

        通過定義儲存函式,就能像使用MySQL提供的函式那樣。換言之,儲存函式是自己定義的,而內部函式是MySQL開發者定義的。

       如果SQL語句較為複雜,下面加上BEGIN與END的寫法更佳。

DELIMITER //
CREATE FUNCTION countStu2(stu_sex CHAR) -- 預設是IN,OUT、INOUT不支援。效果是IN,但是不能加上IN
RETURNS INT  -- 定義返回值型別
BEGIN
   RETURN  複雜的SQL 
END // -- 結束標記代表的是儲存過程定義的結束。而不是不懂裝懂的把結束標記放在SQL結尾
DELIMITER ;

10.3.1  使用SHOW STATUS 檢視儲存過程或函式的狀態

SHOW PROCEDURE STATUS LIKE 'C%';

  

SHOW FUNCTION STATUS LIKE 'C%';

        知道了儲存過程,如果希望檢視具體的儲存過程或者儲存函式的定義。

SHOW CREATE PROCEDURE study.CountStu;

-- Create Procedure 列為核心語句
CREATE DEFINER=`root`@`localhost` PROCEDURE `CountStu`(IN stu_sex CHAR,OUT num INT)
BEGIN 
   SELECT COUNT(*) INTO num FROM t_student WHERE sex = stu_sex;
END

提示:

        帶上資料庫的名字,小心查詢不到。

        檢視儲存函式有哪些。

SHOW FUNCTION STATUS LIKE 'C%'

        檢視具體的儲存函式建立語句。

SHOW CREATE FUNCTION study.countStu2

-- Create Function 列的語句
CREATE DEFINER=`root`@`localhost` FUNCTION `countStu2`(stu_sex CHAR) 
RETURNS int(11)
RETURN  (SELECT COUNT(*) FROM t_student WHERE sex = stu_sex)

  

10.3.3  從information_schema.Routines 表中查詢儲存過程與函式(瞭解)

        原來,MySQL中的儲存過程與儲存函式都存放在information_schema資料庫下的Routines表中。

SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME LIKE 'C%'

  

        如果什麼時候忘記了儲存函式或者儲存過程的名字,可以查詢這張表的資料。然後確定了是某個儲存過程或者是儲存函式,就可以使用SHOW CREATE PROCEDURE / FUNCTION  資料庫.sp_name檢視指定的建立語句了。

10.4.1  修改儲存過程

        語法:ALTER  PROCEDURE |  FUNCTION  sp_name [ 儲存特性 ]

修改儲存過程,將讀寫許可權改為 MODIFIES SQL DATE 並指明呼叫者
ALTER PROCEDURE countStu2
MODIFIES SQL DATE   -- 表示子程式中包含寫資料的語句
SQL SECURITY INVOKER  -- 表示呼叫者才能執行

10.5.1  刪除儲存過程

        刪除儲存過程語法:DROP  PROCEDURE [ IF EXISTS ] sp_name;  

        刪除儲存函式語法:DROP  FUNCTION     [ IF EXISTS ] function_name;  

SHOW PROCEDURE STATUS LIKE 'C%'

  

DROP PROCEDURE IF EXISTS study.CountTec;  -- 刪除study庫下的名為CountTec儲存過程

SHOW PROCEDURE STATUS LIKE 'c%' --再次檢視有哪些儲存過程