存儲過程簡單來講,就是爲之後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的做用不只限於批處理。使用存儲過程須要MySQL5及之後的版本支持。node
經過把處理封閉在容易使用的單元中,簡化複雜的操做;將一系列處理步驟放到同一存儲過程當中,保證了數據的完整性和操做的安全性;簡化對變動的管理;提升性能。mysql
使用存儲過程比使用單獨的SQL語句要快;sql
存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可使用它們來編寫功能更強更靈活的代碼;安全
CREATE PROCEDURE sp_name ([proc_parameter[,...]])ide
[characteristic ...] routine_body函數
proc_parameter:性能
[ IN | OUT | INOUT ] param_name typespa
create procedure sp_test()3d
beginblog
select name,classes_name from student222;
end
CALL sp_name;
call sp_test;
DROP PROCEDURE [ IF EXISTS ] sp_name;
drop procedure if exists sp_test;
SHOW CREATE PROCEDURE sp_name;
show create procedure sp_test;
show procedure status like 'sp_test';
(1)IN參數:只用來向過程傳遞信息,爲默認值,在MySQL存儲過程內部可能會修改此參數,但in類型參數的修改對調用者(caller)來講是不可見的。
create procedure pr_param_in(in id int)
begin
if (id is not null) then
set id=id+1;
end if;
select id as id_inner;
end;
set @id=10;
call pr_param_in(@id);
select @id as id_out;
能夠看到用戶變量@id傳入值爲10,執行存儲過程後,在過程內部值爲:11(id_inner),但外部變量值依舊爲:10(id_out)
===================================================================================
(2)OUT參數:只用來從過程傳回信息,傳值給調用者,在存儲過程內部,該參數初始值爲 null,不管調用者是否給存儲過程參數設置值。
create procedure pr_param_out(out id int)
begin
select id as id_inner_1;
if (id is not null) then
set id=id+1;
select id as id_inner_2;
else
select 1 into id; -- 使用select...into...傳回值給out參數
end if;
select id as id_inner_3;
end;
set @id=10;
call pr_param_out(@id);
select @id as id_out;
能夠看出,雖然咱們設置了用戶定義變量@id爲10,傳遞@id給存儲過程後,在存儲過程內部,id的初始值老是 null(id_inner_1)。最後id值(id_out=1)傳回給調用者。
===================================================================================
(3)INOUT參數能夠向過程傳遞信息,也能夠從存儲過程內部傳值給調用者。
create procedure pr_param_inout(inout id int)
begin
select id as id_inner_1;
if (id is not null) then
set id=id+1;
select id as id_inner_2;
else
select 1 into id;
end if;
select id as id_inner_3;
end;
set @id=10;
call pr_param_inout(@id);
select @id as id_out;
從結果能夠看出:咱們把 @id(10)傳給存儲過程後,存儲過程最後又把計算結果值11(id_inner_3)
傳回給調用者。
===================================================================================
經過以上例子:
1) 若是僅僅想把數據傳給MySQL存儲過程,那就用in類型參數;
2) 若是僅僅從MySQL存儲過程返回值,那就用out類型參數;
3) 若是須要把數據傳給MySQL存儲過程通過計算再傳回給咱們,那就用inout類型參數。
===================================================================================
【參數名和列名不要重名,不然會出錯;BEGIN..End間聲明的變量名不能與關鍵字重名;mysql中不能採用select left1=Lft from table where...的方式獲取值!只能用set爲變量賦值】----這個規則也適用於函數
create procedure CountLayer(IN nodeid int,OUT x1 int)
begin
declare left1 int;
declare right1 int;
set left1=(select Lft from treelevel where Node_id = nodeid);
set right1=(select Rgt from treelevel where Node_id = nodeid);
select count(*) into x1 from treelevel where Lft<=left1 and Rgt>=right1;
end
call CountLayer(1,@xx);
select @xx;
===================================================================================
create procedure sp_type_cnt(IN in_type varchar(20),OUT out_cnt int)
BEGIN
select count(*) from classes222 where name =in_type into out_cnt;
END
call sp_type_cnt('AA班',@cnt);
select @cnt;