Mysql中怎樣創建和使用存儲過程


1、什么是存儲過程

  存儲過程,帶有邏輯的sql語句

2、存儲過程特點

  1)執行效率非常快!存儲過程是在數據庫的服務器端執行

  2)移植性很差!不同的數據庫的存儲過程是不能移植的。

3、存儲過程語法

  

-- 創建存儲過程
DELIMITER $ --聲明存儲過程的結束符
CREATE PROCEDURE stu_test() --存儲過程名稱(參數列表)
BEGIN    --開始
    -- 可以寫多個sql語句          -- sql語句+流程控制    
END $    --結束 結束符

-- 執行存儲過程
call stu_test()   --call 存儲過程名稱(參數)

參數:
IN:  表示輸入參數,可以攜帶數據帶存儲過程中
OUT: 表示輸出參數,可以從存儲過程中返回結果 
INOUT: 表示輸入輸出參數,兩者結合

 

4、案例

 

-- 存儲過程
-- 1、需求:傳入一個學生ID,查詢該學生的信息
    -- 帶有輸入參數的存儲過程
delimiter $
create PROCEDURE stu_findByid(in sid int)
begin
    select * from student where id=sid;
END $
-- 調用存儲過程
call stu_findByid(1);

-- 2、帶有輸出參數的存儲過程
delimiter $
create procedure stu_out(out str varchar(20))
begin
    -- 給參數賦值
    set str='這是一個輸出參數';
end $
-- 刪除存儲過程
drop procedure stu_inout;
-- 調用存儲過程
-- 1)定義了一個變量
-- 2)定義了一個會話變量接收存儲過程輸出的參數
call stu_out(@name);
select @name;
-- 3、輸入輸出參數的存儲過程
delimiter $
create procedure stu_inout(inout n int)
begin
    select n;
    set n=500;
end $
set @n=10;
call stu_inout(@n);
select @n;

-- 4、帶條件判斷的存儲過程
    -- 需求:輸入一個正整數,如果1,返回“星期一”,如果2,返回“星期二。。。。其他返回輸入錯誤”
delimiter $
create procedure stu_testIf(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='輸入錯誤';
    end if;         -- 結束
end $
-- 執行存儲過程
call stu_testIf(2,@str);
select @str;

-- 5、帶循環功能的存儲過程
    -- 輸入一個整數,求和。比如輸入100,統計1-100的和
delimiter $
create procedure stu_testWhile(in num int,out result int)
begin
        -- 定義兩個局部變量
        DECLARE i int default 1;
        declare vsum int default 0;
        while i<=num do
                set vsum = vsum+i;
                set i = i+1;
        end while;
        set result = vsum;
END $
call stu_testWhile(100,@result);
select @result;
drop procedure stu_testWhile;
-- 6、使用查詢的結果賦值給變量(into)
delimiter $
create procedure stu_findByid2(in eid int,out vname varchar(20))
begin
    select name into vname from student where id=eid;
end
call stu_findByid2(1,@vname);
select @vname;
-- 7、練習,編寫一個存儲過程
use students;
select * from user;
    -- 如果學生的英語平均分小於等於70分,剛輸出‘一般’
    -- 如果學生的英語平均分大於70,且小於等於90分,剛輸出‘良好’
    -- 如果學生的英語平均分大於90分,剛輸出‘優秀’
delimiter $
create procedure stu_testAvg(out str varchar(20))
begin
    -- 計算英語平均分
    declare savg double;
    select avg(score) into savg from user;
    if savg<=70 then
        set str='一般';
    elseif savg>70 and savg<=90 then
        set str='良好';
    else 
        set str='優秀';
    end if;
end $
call stu_testAvg(@str);
select @str;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM