mysql中的变量和存储过程
1. 全局变量
全局变量可以直接使用,不用声明。全局变量前必须加 @
1.1 赋值全局变量
-- 可以被赋值成任何类型
SET @var = XXX
-- 通过 into 赋值,(查询出来的结果必须只有零到一行,列的个数需要和变量个数相同)
SELECT a,b FROM tableName where id = 1 INTO @var1,@var2
1.2 使用全局变量
SELECT @变量名
2. 存储过程
0. 前奏
-- 将;结束符替换为 $$
DELIMITER $$
0.0 结尾
-- 将结束符换回 ;
DELIMITER ;
1. 创建存储过程
-- end后面跟 $$ 是因为前面修改了结束符
create procedure 存储过程名字 (参数列表)
begin
方法体;
end $$
-- 参数列表(可以定义多个,之间用,分隔开):
-- IN 代表传入一个变量,在存储过程中修改该变量的值,外部的这个变量也不会被修改
-- OUT 代表修改从外部传入的这个变量的值
-- INOUT 结合IN和OUT
-- 例如 : IN idx INT
-- 例如 : OUT `name` VARCHAR(255)
(IN|OUT|INOUT) 参数名字 类型
2. 操作变量
使用变量,直接使用即可
select * from id = idx
赋值变量
-- 可以被赋值成任何类型(因为mysql会自动类型转换,但是赋值尽量要符合类型)
SET idx = XXX
-- 通过 into 赋值,(查询出来的结果必须只有零到一行,列的个数需要和变量个数相同)
SELECT a,b FROM tableName where id = 1 INTO idx,`name`
3. 操作存储过程
-- 调用存储过程,参数列表中IN类似可以传递数值和变量,OUT和INOUT只能传递全局变量
call 存储过程名(参数列表)
-- 查看所有的存储过程
select procedure status;
-- 查看 存储过程创建的语句
show create procedure 存储过程名;
-- 删除 存储过程
drop procedure 存储过程名
drop procedure if exists 存储过程名 -- 如果存在就删除,不存在就不删除
4. 方法体
方法体中可以写sql语句
4.1 声明局部变量,使用default来赋默认值
-- declare 变量名 类型
declare c int;
declare address varchar(128) default 'Asia/Shanghai';
4.2 赋值局部变量
-- set 方式和 into 方式
4.3 if语句
if 判断条件 then
方法体
elseif 判断条件 then
方法体
else
方法体
end if
4.4 循环
-- while循环
while 循环条件 do
方法体
end while
-- do..while循环
repeat
方法体
until v_i >= 5 end repeat;
-- 死循环
loop
方法体
end loop
-- * 跳出循环,在循环前加上标识,end 循环结尾加上标识 ,内部使用 leave 标识 跳出循环(break) , 也可以使用 iterate 标识 开启下一次循环(continue)
-- 例子
look:loop
if XXX then
leave look;
end if
end loop look;
5. 技巧
5.1 设置语句错误自动回滚
DECLARE t_error INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;
# TODO...
if t_error = 1 then
rollback;
else
commit;
end if;