創(chuàng)建存儲(chǔ)過(guò)程:
-- 定義結(jié)束符號(hào)
DELIMITER $
CREATE PROCEDURE pro_test()
BEGIN
SELECT * FROM employee;
END $
-- 調(diào)用存儲(chǔ)過(guò)程
CALL pro_test();

Paste_Image.png
*** 刪除存儲(chǔ)過(guò)程:***
DROP PROCEDURE pro_testByAvg;
mysql數(shù)據(jù)庫(kù)三種變量:
- 全局變量。mysql內(nèi)置的變量,mysql程序關(guān)閉的時(shí)候全局變量才會(huì)失效??!
-- character_set_client: mysql接收的客戶端的數(shù)據(jù)編碼
-- character_set_results: mysql使用什么編碼輸出給客戶端數(shù)據(jù)
-- 查看某個(gè)全局變量: select @@變量名
-- 修改某個(gè)全局變量: set @@變量名=值 - 會(huì)話變量。變量只在某次登錄的會(huì)話中有效!退出連接,會(huì)話變量數(shù)據(jù)失效?。?br>
-- 查看某個(gè)會(huì)話變量: select @變量名
-- 修改/定義某個(gè)會(huì)話變量: set @變量名=值 - 局部變量:在存儲(chǔ)過(guò)程中定義的變量。存儲(chǔ)過(guò)程結(jié)束局部變量失效!!
-- 查看某個(gè)局部變量: select 變量名
-- 修改某個(gè)局部變量: set 變量名=值
-- 定義某個(gè)局部變量: declare 變量名 數(shù)據(jù)類型;
帶有輸入?yún)?shù)的存儲(chǔ)過(guò)程:
-- 需求: 傳入員工id查詢對(duì)應(yīng)的員工
DELIMITER $
CREATE PROCEDURE pro_testByIn(IN eid INT) -- 參數(shù)類型(IN) 參數(shù)名稱 數(shù)據(jù)類型(int)
BEGIN
SELECT * FROM employee WHERE id=eid;
END $
-- 調(diào)用
CALL pro_testByIn(2);
帶有輸出參數(shù)的存儲(chǔ)過(guò)程:
DELIMITER $
CREATE PROCEDURE pro_testByOut(OUT n VARCHAR(20))
BEGIN
-- 修改變量n(在存儲(chǔ)過(guò)程中,n(會(huì)話變量)被當(dāng)成臨時(shí)變量處理 )
SET n = '輸出參數(shù)';
END $
-- 定義會(huì)話變量去接收輸出參數(shù)數(shù)據(jù)
-- set @n='eric';
CALL pro_testByOut(@n);
-- 查看會(huì)話變量n
SELECT @n;
帶有輸入輸出參數(shù)的存儲(chǔ)過(guò)程:
DELIMITER $
CREATE PROCEDURE pro_testByInOut(INOUT n VARCHAR(20))
BEGIN
-- 查看n變量
SELECT n;
-- 修改n變量
SET n = '500';
END $
-- 定義會(huì)話變量調(diào)用存儲(chǔ)過(guò)程
SET @n='100';
CALL pro_testByInOut(@n);
-- 查看n
SELECT @n;
帶有判斷條件的存儲(chǔ)過(guò)程:
需求: 輸入一個(gè)num整數(shù),num=1 ,輸出‘星期一’,num=2,輸出‘星期二’,num=3,輸出‘星期三’,否則,輸出‘錯(cuò)誤參數(shù)’
DELIMITER $
CREATE PROCEDURE pro_testByIf(IN num INT,OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str = '星期一';
ELSEIF num= 2 THEN
SET str ='星期二';
ELSEIF num=3 THEN
SET str = '星期三';
ELSE
SET str = '錯(cuò)誤參數(shù)';
END IF;
END $
CALL pro_testByIf(5,@str);
SELECT @str;
帶有循環(huán)條件的存儲(chǔ)過(guò)程:
需求: 輸入一個(gè)num,計(jì)算從1到num的總和。
DELIMITER $
CREATE PROCEDURE pro_testByWhile(IN num INT,OUT score INT)
BEGIN
-- int result =0;
-- for(int i=1;i<=100;i++){
-- result += i;
-- }
-- 定義局部變量
DECLARE i INT DEFAULT 1;
DECLARE result INT DEFAULT 0;
WHILE i<=num DO
SET result = result + i;
SET i = i+1;
END WHILE;
SET score = result;
END $
CALL pro_testByWhile(200,@score);
SELECT @score;
攜帶數(shù)據(jù)庫(kù)的數(shù)據(jù)給輸出參數(shù)(INTO):
需求: 傳入員工id,查詢對(duì)應(yīng)的員工,輸出員工姓名
DELIMITER $
CREATE PROCEDURE pro_testByData(IN eid INT,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM employee WHERE id=eid;
END $
CALL pro_testByData(2,@sname);
SELECT @sname;
存儲(chǔ)過(guò)程練習(xí):
在student表的數(shù)據(jù)基礎(chǔ)上,設(shè)計(jì)一個(gè)存儲(chǔ)過(guò)程:
1)計(jì)算出所有學(xué)生的英語(yǔ)平均分
2)
如果平均分,大于80分,且小于等于100分,輸出'優(yōu)秀'
如果平均分,大于等于60分,且小于等于80分,輸出'良好'
如果平均分,小于60分,輸出'不及格'
USE day14;
SELECT * FROM student2;
DELIMITER $
CREATE PROCEDURE pro_testByAvg(OUT str VARCHAR(20),OUT tavg FLOAT)
BEGIN
DECLARE savg FLOAT DEFAULT 0.0; -- 定義一個(gè)局部變量
SELECT AVG(english) INTO savg FROM student2; -- 把查詢到的結(jié)果放到變量中
IF savg>80 AND savg<=100 THEN
SET str = '優(yōu)秀';
ELSEIF savg>=60 AND savg<=80 THEN
SET str = '良好';
ELSE
SET str = '不及格';
END IF;
SET tavg = savg;
END $
CALL pro_testByAvg(@str,@tavg);
SELECT @str;
SELECT @tavg;