【MySql】5.存儲過程的使用

   存儲過程簡單來講,就是爲之後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的做用不只限於批處理。使用存儲過程須要MySQL5及之後的版本支持。node

1、爲何要使用存儲過程

   經過把處理封閉在容易使用的單元中,簡化複雜的操做;將一系列處理步驟放到同一存儲過程當中,保證了數據的完整性和操做的安全性;簡化對變動的管理;提升性能。mysql

   使用存儲過程比使用單獨的SQL語句要快;sql

存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可使用它們來編寫功能更強更靈活的代碼;安全

2、基本操做

1、建立存儲過程

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

2、執行存儲過程

CALL sp_name;

call sp_test;

wKioL1NoQRzgJ-WOAABDnxgenjc052.jpg

3、刪除存儲過程

DROP PROCEDURE [ IF EXISTS ] sp_name;

drop procedure if exists sp_test;

4、查看存儲過程建立信息

SHOW CREATE PROCEDURE sp_name;

show create procedure sp_test;

wKiom1NoQhexFxAFAAB08NfLSrQ846.jpg

wKioL1NoQe2QQ9aBAACky2XY180259.jpg

5、查看存儲過程狀態

show procedure status like 'sp_test';

wKiom1NoQnehI_ArAADcTpnVT5g827.jpg

6、使用存儲過程參數

(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);

wKioL1NolgLyaTLvAAAmVwS3D8o219.jpg


select @id as id_out;

wKiom1NolmqwrGy5AAAo-wR4LCE124.jpg

能夠看到用戶變量@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);

wKiom1NooCnzXIgxAAAr7zX2zX8865.jpg

wKioL1Non__QStXQAAAtlY9GbMc426.jpg

select @id as id_out;

wKioL1NooEjAZkgrAAAnHVdjWeE465.jpg

能夠看出,雖然咱們設置了用戶定義變量@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);

wKiom1NooxaTJTSJAAA4Cm7Wnb4333.jpg

wKioL1NoouzhoThDAAA1ry99474453.jpg

wKiom1Nooxey81E7AAA0kzne5RQ541.jpg

select @id as id_out;

wKioL1Noo1eCov0wAAAoB1SjQYw108.jpg

從結果能夠看出:咱們把 @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;

wKioL1NoSVCCDabhAAAefFYQf48628.jpg

相關文章
相關標籤/搜索