07 存儲(chǔ)過(guò)程

創(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ù)三種變量:

  1. 全局變量。mysql內(nèi)置的變量,mysql程序關(guān)閉的時(shí)候全局變量才會(huì)失效??!
    -- character_set_client: mysql接收的客戶端的數(shù)據(jù)編碼
    -- character_set_results: mysql使用什么編碼輸出給客戶端數(shù)據(jù)
    -- 查看某個(gè)全局變量: select @@變量名
    -- 修改某個(gè)全局變量: set @@變量名=值
  2. 會(huì)話變量。變量只在某次登錄的會(huì)話中有效!退出連接,會(huì)話變量數(shù)據(jù)失效?。?br> -- 查看某個(gè)會(huì)話變量: select @變量名
    -- 修改/定義某個(gè)會(huì)話變量: set @變量名=值
  3. 局部變量:在存儲(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容