Mysql 存储过程 简单案例
1.in单条件查询存储过程
CREATE PROCEDURE `sp1`(IN `t1parm` varchar(50))
BEGIN
Select * from test1 where t1=t1parm;
END
call sp1('1874')
set @num = '1874';
call sp1(@num);
注意 参数必须有@,否则Unknown system variable 'num'
2.out返回值存储过程
CREATE PROCEDURE `sp2`(OUT count int)
BEGIN
Select Count(0) into count from test1;
END
call sp3(@count);
Select @count;
注意 返回参数不需要定义,不能赋值,否则返回null
3.inout返回值存储过程
CREATE PROCEDURE `sp2`(IN `t1parm` varchar(50),inout count int)
BEGIN
Select count(0) into count from test1 where t1=t1parm;
END
call sp2('1874',@count);
Select @count;
注意 inout 可以赋值,也可以使用,但是后期会被改变并返回
4.Declare定义变量的存储过程
CREATE PROCEDURE `sp4`()
BEGIN
DECLARE l_int int default 4;
Select l_int;
END
DECLARE局部变量,该关键字必须在存储过程中Begin…End使用,作用域也只能存在于Begin…End中,定义变量不需要加@
5.Set定义变量的存储过程
CREATE PROCEDURE `sp5`()
BEGIN
SET @t1=0, @t2=1, @t3=2;
Select @t1,@t2,@t3;
END
不需要定义,直接赋值,根据赋值来定义变量类型
6.Select定义变量的存储过程
使用:=来赋值
CREATE PROCEDURE `sp6`()
BEGIN
SELECT @t1:=@t2:[email protected]:=400,@t1,@t2,@t3;
END
带@的变量叫会话变量、用户变量,作用域在一个会话中,如:
在这个会话中,执行完存储过程了,再去查询这个变量,依然会生效。
7.游标存储过程
CREATE PROCEDURE `sp7`()
BEGIN
DECLARE _t1 varchar(50);-- 定义变量作为查询的返回值
DECLARE _OK INT(11) DEFAULT 1;-- 是否继续循环的状态
-- DECLARE _AutoInt INT(11) DEFAULT 1;-- 定义自增量
DECLARE cur CURSOR
for
Select t1 from test1 where t1=362; -- 定义游标
-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET _OK = 0; -- 若没有数据返回,程序继续,并将变量_OK设为0
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _OK = 0; -- 若没有数据返回,触发SQLSTATE '02000',程序继续,并将变量_OK设为0 另一种写法
OPEN cur;-- 打开游标
FETCH cur INTO _t1;-- FETCH用来检索当前行的t1列到_t1局部变量中
WHILE _OK != 0 DO -- 循环体 / 根据没有数据返回改变变量为0停止循环
update test1 Set t3:=CONCAT(t1,t3) where t1=_t1;
-- Set _AutoInt = _AutoInt + 1;
FETCH cur INTO _t1;
END WHILE;
CLOSE cur;-- 关闭游标
END
注:MySQL游标只能用于存储过程(和函数)