存储过程
大概定义:用一个别名来描述多个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只可以读取值/变量,不能更改
- out不能读,可以更改
- inout既可以读又可以更改