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;