存儲過程
大概定義:用一個别名來描述多個sql語句的執行過程。
- 最簡單
delimiter // create PROCEDURE p1() begin select * from userinfo; end // delimiter ; call p1();
- 傳參(in, out, inout)
- in 表示傳入的參數, 可以傳入數值或者變量,即使傳入變量,并不會更改變量的值,可以内部更改,僅僅作用在函數範圍内。
delimiter // create procedure p2( in v1 int ) begin set v1 = 2 * v1; select v1; end // delimiter ; call p2(19); ---------------- delimiter // create procedure p6( in v int ) begin set v = 10; select v; end // delimiter ; call p6(10); set @v4 = 0; call p6(@v4); select @v4; -- 此時@v4依然為0
- out 表示存儲執行存儲過程的傳回結果,且參數隻能是一個變量,且隻能對其指派(函數執行完以後也生效),不能在函數内擷取其值。
delimiter // create procedure p3( out v int ) begin set v = 10; end // delimiter ; set @v1 = 0; # @varible_name 類似于定義一個局部變量,跟session一樣 call p3(@v1); select @v1; ----------------------------- delimiter // create procedure p4( out v int ) begin set v = v + 5; -- 這兒有問題,不能這樣,隻能直接指派 select v; end // delimiter ; -- 這段代碼是有問題的。 delimiter // create procedure p5( out v int ) begin set v = 5; -- 對的 select v; end // delimiter ; set @v3 = 0; call p5(@v3);
- inout 表示從外部傳入的參數經過修改後可以傳回的變量,既可以使用傳入變量的值也可以修改變量的值(即使函數執行完)。
delimiter // create procedure p7( inout v int ) begin set v = 9999; select v; end // delimiter ; call p7(10); set @v5 = 0; call p7(@v5); select @v5; ------------------------------------ delimiter // create procedure p8( inout v int ) begin set v = v + 9999; select v; end // delimiter ; set @v6 = 1; call p8(@v6); select @v6;
- in 表示傳入的參數, 可以傳入數值或者變量,即使傳入變量,并不會更改變量的值,可以内部更改,僅僅作用在函數範圍内。
綜上
- in隻可以讀取值/變量,不能更改
- out不能讀,可以更改
- inout既可以讀又可以更改