前言
本章我們將學(xué)習數(shù)據(jù)庫中的存儲過程突倍,了解什么是存儲過程蚌成,以及在MySQL中創(chuàng)建和調(diào)用存儲過程策橘。
存儲過程是什么
存儲過程(Stored Procedure)是在數(shù)據(jù)庫系統(tǒng)中窗悯,一組為了完成特定功能的SQL 語句集蜓谋,它存儲在數(shù)據(jù)庫中梦皮,一次編譯后永久有效,用戶調(diào)用存儲過程并傳遞參數(shù)來執(zhí)行它桃焕。
存儲過程的優(yōu)點
存儲過程是數(shù)據(jù)庫中的重要組件剑肯,具有以下優(yōu)點:
重復(fù)使用
存儲過程一旦定義后,用戶可以反復(fù)調(diào)用观堂,不需要重寫編寫SQL語句让网。
安全
存儲過程通過參數(shù)傳入數(shù)據(jù),避免了SQL注入攻擊型将,同時可以給存儲過程配置權(quán)限寂祥,只讓特定的用戶使用。
減少網(wǎng)絡(luò)流量
調(diào)用存儲過程時七兜,只需要傳遞調(diào)用存儲過程名稱和參數(shù)丸凭,不需要發(fā)送SQL語句,因此減少了網(wǎng)絡(luò)流量腕铸,提高了調(diào)用的速度惜犀。
存儲過程的語法
創(chuàng)建視圖
delimiter //
create procedure 存儲過程名([in|out|inout]參數(shù)名 類型....)
begin
SQL 語句;
end//
delimiter ;
語法說明:
delimiter//
是將SQL代碼的結(jié)束符號設(shè)置為//,因為存儲過程中有多條SQL語句以分號結(jié)束狠裹,如果定義存儲過程也以分號結(jié)束虽界,就存在混淆,所以先將//作為定義存儲過程的結(jié)束符號涛菠,創(chuàng)建完成后再定義為原來的分號莉御。
[in|out|inout]
參數(shù)前可以添加in撇吞、out、inout關(guān)鍵字設(shè)置參數(shù)的類型:
in 代表輸入?yún)?shù)礁叔,用于傳入數(shù)據(jù)牍颈,默認
out 代表輸出參數(shù),用于返回數(shù)據(jù)琅关,類似return的作用
inout 代表輸入和輸出都可以
刪除視圖
drop procedure 存儲過程名;
調(diào)用存儲過程
call 存儲過程名(參數(shù))
代碼案例:
-- 刪除存儲過程
drop procedure if exists pd_select_student;
-- 定義無參的存儲過程
delimiter //
create procedure pd_select_student()
begin
select * from tb_student;
end//
delimiter ;
-- 調(diào)用存儲過程
call pd_select_student();
--定義帶參數(shù)的存儲過程
drop procedure if exists pd_select_student_by_name;
delimiter //
create procedure pd_select_student_by_name(s_name nvarchar(20))
begin
select * from tb_student where stu_name = s_name;
end//
delimiter ;
call pd_select_student_by_name('李四');
-- 定義通過學(xué)號修改學(xué)生姓名煮岁、年齡、性別的存儲過程
drop procedure if exists pd_update_student;
delimiter //
create procedure pd_update_student(s_id int,s_name varchar(20),s_gender varchar(20),s_age int)
begin
update tb_student set stu_name = s_name,stu_gender=s_gender,stu_age=s_age where stu_id = s_id;
end//
delimiter ;
call pd_update_student(1,'張三','女',18);
帶返回值的存儲過程
存儲過程也可以返回值給調(diào)用者涣易,實現(xiàn)步驟是:
用out定義輸出參數(shù)
在存儲過程內(nèi)部画机,使用into將查詢結(jié)果賦值給輸出參數(shù)
調(diào)用存儲過程前,定義變量新症,將變量作為輸出參數(shù)
-- 查詢年齡在一定范圍內(nèi)學(xué)生的人數(shù)
-- 使用out定義輸出參數(shù)
create procedure pd_get_count_by_age(min_age int,max_age int,
out count int)
begin
-- 使用into語句將返回值賦值給輸出參數(shù)
select count(*) into count from tb_student where stu_age between
min_age and max_age;
end//
delimiter ;
-- 定義變量
set @stu_count = 0;
-- 調(diào)用存儲過程時步氏,傳入變量
call pd_get_count_by_age(10,80,@stu_count);
-- 顯示變量
select @stu_count '人數(shù)';
總結(jié)
存儲過程可以封裝多條SQL語句,保存在數(shù)據(jù)庫中徒爹,可以被重復(fù)調(diào)用戳护,執(zhí)行效率高、安全性也比較高瀑焦,是軟件開發(fā)中常用的數(shù)據(jù)庫技術(shù),但是大量的存儲過程也會給項目帶來較多的維護成本梗肝。