MySQL - 儲存過程和函式
阿新 • • 發佈:2020-11-27
MySQL - 儲存過程和函式
建立和呼叫儲存過程
-- 建立stu_group()儲存過程,封裝 分組查詢總成績,並按照總成績升序排序的功能 -- 注意: DELIMITER 必須寫在一行的最前面, 前面不能有空格#### DELIMITER $ CREATE PROCEDURE stu_group() BEGIN SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC; END$ DELIMITER ; -- 呼叫stu_group()儲存過程 CALL stu_group();
檢視和刪除儲存過程
-- 檢視db6資料庫中所有的儲存過程
SELECT * FROM mysql.proc WHERE db='db6';
-- 刪除儲存過程
DROP PROCEDURE IF EXISTS stu_group;
變數
-- 定義一個int型別變數,並賦預設值為10 DELIMITER $ CREATE PROCEDURE pro_test1() BEGIN -- 定義變數 DECLARE num INT DEFAULT 10; -- 使用變數 SELECT num; END$ DELIMITER ; -- 呼叫pro_test1儲存過程 CALL pro_test1(); -- 定義一個varchar型別變數並賦值 DELIMITER $ CREATE PROCEDURE pro_test2() BEGIN -- 定義變數 DECLARE NAME VARCHAR(10); -- 為變數賦值 SET NAME = '儲存過程'; -- 使用變數 SELECT NAME; END$ DELIMITER ; -- 呼叫pro_test2儲存過程 CALL pro_test2(); -- 定義兩個int變數,用於儲存男女同學的總分數 DELIMITER $ CREATE PROCEDURE pro_test3() BEGIN -- 定義兩個變數 DECLARE men,women INT; -- 查詢男同學的總分數,為men賦值 SELECT SUM(score) INTO men FROM student WHERE gender='男'; -- 查詢女同學的總分數,為women賦值 SELECT SUM(score) INTO women FROM student WHERE gender='女'; -- 使用變數 SELECT men,women; END$ DELIMITER ; -- 呼叫pro_test3儲存過程 CALL pro_test3(); -- SET方式實現 DELIMITER $ CREATE PROCEDURE pro_test3() BEGIN -- 定義兩個變數 DECLARE men,women INT; -- 查詢男同學的總分數,為men賦值 SET men = (SELECT SUM(score) FROM student WHERE gender='男'); -- 查詢女同學的總分數,為women賦值 SET women = (SELECT SUM(score) FROM student WHERE gender='女'); -- 使用變數 SELECT men,women; END$ DELIMITER ; -- 呼叫pro_test3儲存過程 CALL pro_test3();
if語句
/* if語句 IF 判斷條件1 THEN 執行的sql語句1; [ELSEIF 判斷條件2 THEN 執行的sql語句2;] ... [ELSE 執行的sql語句n;] END IF; */ /* 定義一個int變數,用於儲存班級總成績 定義一個varchar變數,用於儲存分數描述 根據總成績判斷: 380分及以上 學習優秀 320 ~ 380 學習不錯 320以下 學習一般 */ DELIMITER $ CREATE PROCEDURE pro_test4() BEGIN -- 定義變數 DECLARE total INT; DECLARE info VARCHAR(10); -- 查詢總成績,為total賦值 SELECT SUM(score) INTO total FROM student; -- 對總成績判斷 IF total > 380 THEN SET info = '學習優秀'; ELSEIF total >= 320 AND total <= 380 THEN SET info = '學習不錯'; ELSE SET info = '學習一般'; END IF; -- 查詢總成績和描述資訊 SELECT total,info; END$ DELIMITER ; -- 呼叫pro_test4儲存過程 CALL pro_test4();
引數傳遞
/*
引數傳遞
CREATE PROCEDURE 儲存過程名稱([IN|OUT|INOUT] 引數名 資料型別)
BEGIN
SQL 語句列表;
END$
IN:代表輸入引數,需要由呼叫者傳遞實際資料(預設)
OUT:代表輸出引數,該引數可以作為返回值
INOUT:代表既可以作為輸入引數,也可以作為輸出引數
也可以不指定輸入輸出型別.
*/
/*
輸入總成績變數,代表學生總成績
輸出分數描述變數,代表學生總成績的描述資訊
根據總成績判斷:
380分及以上 學習優秀
320 ~ 380 學習不錯
320以下 學習一般
*/
DELIMITER $
CREATE PROCEDURE pro_test5(IN total INT,OUT info VARCHAR(10))
BEGIN
-- 對總成績判斷
IF total > 380 THEN
SET info = '學習優秀';
ELSEIF total >= 320 AND total <= 380 THEN
SET info = '學習不錯';
ELSE
SET info = '學習一般';
END IF;
END$
DELIMITER ;
-- 呼叫pro_test5儲存過程 , @將返回資料儲存到會話的info變數中
CALL pro_test5(350,@info);
CALL pro_test5((SELECT SUM(score) FROM student),@info);
SELECT @info;
while迴圈
/*
while迴圈
初始化語句;
WHILE 條件判斷語句 DO
迴圈體語句;
條件控制語句;
END WHILE;
*/
-- 計算1~100之間的偶數和
DELIMITER $
CREATE PROCEDURE pro_test6()
BEGIN
-- 定義求和變數
DECLARE result INT DEFAULT 0;
-- 定義初始化變數
DECLARE num INT DEFAULT 1;
-- while迴圈
WHILE num <= 100 DO
IF num % 2 = 0 THEN
SET result = result + num;
END IF;
SET num = num + 1;
END WHILE;
-- 查詢求和結果
SELECT result;
END$
DELIMITER ;
-- 呼叫pro_test6儲存過程
CALL pro_test6();
儲存函式
/*
建立儲存函式
CREATE FUNCTION 函式名稱([引數 資料型別])
RETURNS 返回值型別
BEGIN
執行的sql語句;
RETURN 結果;
END$
*/
-- 定義儲存函式,獲取學生表中成績大於95分的學生數量
DELIMITER $
CREATE FUNCTION fun_test1()
RETURNS INT
BEGIN
-- 定義變數
DECLARE s_count INT;
-- 查詢成績大於95分的數量,為s_count賦值
SELECT COUNT(*) INTO s_count FROM student WHERE score > 95;
-- 返回統計結果
RETURN s_count;
END$
DELIMITER ;
/*
呼叫函式
SELECT 函式名稱(實際引數);
*/
-- 呼叫函式
SELECT fun_test1();
/*
刪除函式
DROP FUNCTION 函式名稱;
*/
-- 刪除函式
DROP FUNCTION fun_test1;