MySQL由淺入深探究存儲過程
什么是存儲過程
存儲過程(Stored Procedure)也成為存儲程序,是一種在數據庫中存儲復雜程序,以便外部程序調用的一種數據庫對象。即預先編輯好SQL語句的集合,這個集合完成了某項具體的功能集合,需要這個功能的時候,只要調用這個過程就好。在業(yè)務開發(fā)工過程中,一般不要求使用存儲過程實現業(yè)務流程,編寫的存儲過程不方便調試和擴展,同時沒有移植性。
簡單來說存儲過程就是具有名字的一段代碼,用來完成一個特定的功能。他和函數很像,但是他不是函數,
MySQL 5.0 版本開始支持存儲過程。
存儲過程和存儲函數的區(qū)別
存儲函數的限制比較多,例如不能用臨時表,只能用表變量,而存儲過程的限制較少,存儲過程的實現功能要復雜些,而函數的實現功能針對性比較強。
返回值不同。存儲函數必須有返回值,且僅返回一個結果值;存儲過程可以沒有返回值,但是能返回結果集(out,inout)。
調用時的不同。存儲函數嵌入在SQL中使用,可以在select 存儲函數名(變量值);存儲過程通過call語句調用 call 存儲過程名。
參數的不同。存儲函數的參數類型類似于IN參數,沒有類似于OUT和INOUT的參數。存儲過程的參數類型有三種,in、out和inout:
- in:數據只是從外部傳入內部使用(值傳遞),可以是數值也可以是變量
- out:只允許過程內部使用(不用外部數據),給外部使用的(引用傳遞:外部的數據會被先清空才會進入到內部),只能是變量
- inout:外部可以在內部使用,內部修改的也可以給外部使用,典型的引用 傳遞,只能傳遞變量。
優(yōu)點
- 存儲過程可封裝,并隱藏復雜的商業(yè)邏輯。
- 存儲過程可以回傳值,并可以接受參數。
- 存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數據表或用戶定義函數不同。
- 存儲過程可以用在數據檢驗,強制實行商業(yè)邏輯等。
缺點
- 存儲過程,往往定制化于特定的數據庫上,因為支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的存儲過程。
- 存儲過程的性能調校與撰寫,受限于各種數據庫系統。
存儲過程的創(chuàng)建和調用
創(chuàng)建的存儲過程保存在數據庫的數據字典中。
創(chuàng)建語法:
create procedure 存儲過程的名字(參數列表)
begin
存儲過程體(SQL語句的集合);
end
注意:
①參數列表包含三個部分:
參數模式 參數名 參數類型
(比如: in s_name varchar(20) )
聲明存儲過程:
CREATE PROCEDURE demo_in_parameter(IN s_name varchar(20))
參數模式:
in : 該參數可以作為輸入,需要調用方傳入值來給存儲過程
out : 該參數可以作為輸出,該參數可以作為返回值給調用方
inout : 該參數既可以做輸入,也可以作為輸出
存儲過程開始和結束符號:
BEGIN .... END
②如果存儲體只要一句SQL語句,begin和end可以省略,存儲體里的sql語句結尾處必須加分號,避免數據庫誤判為存儲過程的結束標記,所以需要我們自定義命令的結尾符號:
delimiter 結尾標記 比如:
delimiter $
如果沒有下面用表,先創(chuàng)建
drop table ages; drop table students; create table ages(id int,age int); create table students(id int,name varchar(4),ta_id int); insert into ages(id,age) values(1,12); insert into ages(id,age) values(2,22); insert into ages(id,age) values(3,32); insert into ages(id,age) values(4,42); insert into ages(id,age) values(5,52); insert into ages(id,age) values(6,62); insert into students(id,name,ta_id) values(1,'任波濤',2); insert into students(id,name,ta_id) values(2,'田興偉',1); insert into students(id,name,ta_id) values(3,'唐崇俊',3); insert into students(id,name,ta_id) values(4,'夏銘睿',8); insert into students(id,name,ta_id) values(5,'包琪',1); insert into students(id,name,ta_id) values(6,'夏雨',10); insert into students(id,name,ta_id) values(7,'夏銘雨',10); insert into students(id,name,ta_id) values(8,'白芳芳',6);
無參數存儲過程:
delimiter $ #將語句的結束符號從分號;臨時改為兩個$(可以是自定義) create procedure myp1() begin insert into ages(id,`age`) values (11,'12'); insert into ages(id,`age`) values (21,'13'); insert into ages(id,`age`) values (31,'14'); insert into ages(id,`age`) values (41,'15'); end $ delimiter ; #將語句的結束符號恢復為分號
存儲過程的調用:
call 存儲過程名(參數列表);
調用:
call myp1();
帶in參數模式的存儲過程
案例:通過學生名查詢對應的年齡
delimiter $ create procedure myp2(in s_name varchar(10)) begin select s.name, a.age from students s inner join ages a on s.ta_id = a.id where s.name=s_name; end $
調用:call myp2(‘任波濤’) $
out參數模式的存儲過程
案例:根據學生姓名,返回對應的年齡
create procedure myp3(in sname varchar(10),out age int) begin select a.age into age from students s inner join ages a on s.ta_id = a.id where s.name=sname; end $
調用:
call myp3(‘任波濤’,@age) $ #把值取出來放到變量里去
select @age $ #查看值了
案例:根據學生姓名,返回對應的年齡和學生編號
create procedure myp4(in sname varchar(10),out age int,out sid int) begin select a.age ,s.id into age,sid from students s inner join ages a on s.ta_id = a.id where s.name=sname; end $
調用:
call myp4(‘任波濤’,@age,@sid) $
select @age,@sid $
inout參數模式存儲過程和刪除查看存儲過程
案例:傳入a和b兩個數,然后讓a和b都乘以2后返回
create procedure myp5(inout a int , inout b int) begin set a=a*2; set b=b*2; end $
調用:
set @a=10$ set @b=20$ call myp5(@a,@b)$ select @a,@b $ delimiter ;
#查看存儲過程
show procedure status like 'myp%';
刪除存儲過程:
drop procedure 存儲過程名;
drop procedure myp1; #每次只能刪除一個
查看存儲過程的信息:
show create procedure 存儲名;
show create procedure myp1;
到此這篇關于MySQL由淺入深探究存儲過程的文章就介紹到這了,更多相關MySQL存儲過程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!