1. 程式人生 > 資料庫 >MySQL - 儲存過程和函式

MySQL - 儲存過程和函式

MySQL - 儲存過程和函式

1605250066499

建立和呼叫儲存過程

-- 建立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;