標籤:例子 iter 安全 儲存 執行 輸入輸出 call end uname
一、預存程序
1、定義:一組可程式化的函數,是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定預存程序的名字並給定參數(需要時)來調用執行
2、優點:①將重複性很高的一些操作,封裝到一個預存程序中,簡化了對這些SQL的調用
②批量處理:SQL+迴圈,減少流量,也就是“跑批”
③統一介面,確保資料的安全
3、>預存程序就是具有名字的一段代碼,用來完成一個特定的功能。
>建立的預存程序儲存在資料庫的資料字典中。
4、基本建立格式
1 delimiter// -- 將SQL語句的結束標記設定為//2 DROP PROCEDURE IF EXISTS testprint; -- 如果存在該名字的預存程序則刪除3 CREATE PROCEDURE testprint() -- 建立一個名字為testprint的預存程序, -- 括弧裡面可以傳參數:CREATE PROCEDURE mytest(in sid INT,in suid INT)4 BEGIN -- 代碼部分開始5 SELECT ‘你好,成都‘ as infos; -- 預存程序的代碼部分6 END; -- 代碼部分結束7 // -- 結束標記8 delimiter; -- 編寫編譯結束後將SQL語句的結束標記還原
5、調用
-- 調用無參預存程序CALL testprint();-- 調用有參數的預存程序set @stuid = 1;SET @subid = 1;CALL mytest(@stuid,@subid);
6、預存程序的參數
預存程序可以有0個或多個參數,用於預存程序的定義。
3種參數類型:
IN輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變數)
OUT輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變數)
INOUT輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變數)
建議:>輸入值使用in參數;
>傳回值使用out參數;
>inout參數就盡量的少用。
例子:
1)、傳入學生和科目id ,得到該學生該科目的成績
1 delimiter $$ 2 DROP PROCEDURE IF EXISTS mytest; 3 CREATE PROCEDURE mytest(in sid INT,in suid INT) 4 BEGIN 5 UPDATE score SET score.scscore=scscore+5 6 WHERE score.sid = sid AND score.suid = suid; 7 END; 8 $$ 9 delimiter;10 11 set @stuid = 1;12 SET @subid = 1;13 CALL mytest(@stuid,@subid);
2)、-- 傳入學生序號,擷取顯示該學生的姓名
1 delimiter $$ 2 DROP PROCEDURE IF EXISTS getstuname; 3 CREATE PROCEDURE getstuname(in sid INT,out stuname VARCHAR(100)) 4 BEGIN 5 SELECT student.sname into stuname FROM student WHERE student.sid = sid; 6 END; 7 $$ 8 delimiter; 9 10 set @stuid = 2;11 CALL getstuname(@stuid,@stuname);12 SELECT @stuid as sid,@stuname AS stuname;
MySQL資料庫的預存程序