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%' --再次檢視有哪些儲存過程