大概定義:用一個別名來描述多個sql語句的執行過程。sql
delimiter // create PROCEDURE p1() begin select * from userinfo; end // delimiter ; call p1();
in 表示傳入的參數, 能夠傳入數值或者變量,即便傳入變量,並不會更改變量的值,能夠內部更改,僅僅做用在函數範圍內。session
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 表示從外部傳入的參數通過修改後能夠返回的變量,既能夠使用傳入變量的值也能夠修改變量的值(即便函數執行完)。code
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;