第16章_变量,流程控制与游标
1.变量
分为系统变量
和用户自定义变量
1.1系统变量
1.1.1系统变量分类
系统变量分为全局系统变量
以及会话系统变量
查看所有全局变量
SHOW GLOBAL VARIABLES
查看所有会话变量
SHOW SESSION VARIABLESor
SHOW VARIABLES #默认是会话变量
为变量赋值
SET @@global.变量名 = 变量值
SET GLOBAL 变量名 = 变量值
-------
SET @@session.变量名 = 变量值
SET session 变量名 = 变量值
1.2 用户变量
-
会话用户变量: 作用域和会话变量一样,只对当前连接会话有效
-
局部变量: 只在
BEGIN
和END
语句块中有效.
1.2.1 会话用户变量
-
变量的定义
#方式1: "="或":=" SET @用户变量 = 值; SET @用户变量 := 值; #方式2: ":="或INTO 关键字 SELECT @用户变量 := 表达式[FROM 等子句]; SELECT 表达式 INTO @用户变量 [FROM 等子句];
-
使用
select @变量名
1.2.2局部变量
-
定义: 可以使用
DECLARE
语句定义一个局部变量 -
作用域: 仅仅在定义它的BEGIN...END中有效
-
位置: 只能放在BEGIN...END中,而且只能放在第一句
声明方式
DECLARE 变量名 类型 [default 值];#没有default 初始值为null
赋值方式
SET 变量名 = 值; SET 变量名 := 值; 或 SELECT 字段名 INTO 变量名
2.定义条件与处理程序
定义条件
是事先定义程序执行过程中可能出现的问题,处理程序
定义了在遇到错误时采取的处理方式
2.1定义条件
格式
DECLARE 错误名称 CONDITION FOR 错误码(或错误代码)
注意:
DECLARE ... CONDITION
只能在 存储过程、存储函数 或 触发器 的定义体中使用,因为它是 MySQL 的 复合语句 语法的一部分。这种语法用于定义局部的条件、变量、游标或处理逻辑,不能在普通的 SQL 查询或脚本中单独使用。
2.2定义处理程序
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句
-
处理方式 :
-
CONTINUE
: 表示错误不处理,继续执行 -
EXIT
: 表示遇到错误马上退出 -
UNDO
: 表示遇到错误后撤回之前的操作. MySQL不支持
-
3.流程控制
3.1分支结构之 IF
和java差不多,注意格式
DELIMITER //
CREATE PROCEDURE update_salary_by_eidl(IN emp_id INT)
BEGINDECLARE hire_date DATE;DECLARE diff_year INT;DECLARE salary DOUBLE;
-- 获取员工的入职日期SELECT hire_date INTO hire_date FROM employees WHERE employee_id = emp_id;
-- 计算入职年数差SET diff_year = YEAR(CURDATE()) - YEAR(hire_date);
-- 获取员工的当前薪资SELECT salary INTO salary FROM employees WHERE employee_id = emp_id;
-- 如果员工入职年数大于等于5年,并且薪资小于8000,则增加薪资IF diff_year >= 5 THENIF salary < 8000 THENUPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;END IF;END IF;
END //
DELIMITER ;
3.2分支循环之 case
create procedure test_case(v1 int)
begincase v1when 1 thenselect 'v1=1';when 2 thenselect 'v1=2';when 3 thenselect 'v1=3';elseselect 'v1不等于1,2,3';end case;
end;
3.3循环结构 LOOP
create procedure update_salary_loop(out num int)
begindeclare avg_salary double;declare loop_count int default 0;select avg(salary) into avg_salary from employees;loop_label:loopif avg_salary <12000 thenupdate employees set salary = salary*1.1;elseif avg_salary >=12000 thenleave loop_label;end if;select avg(salary) into avg_salary from employees;set loop_count = loop_count + 1;end loop loop_label;set num = loop_count;
end;
结束循环要用leave,没有内置的条件检查。
循环次数由内部逻辑控制,需要显式退出。
3.4循环结构 WHILE
create procedure test_loop()
begindeclare i int;set i = 1;while i <= 10 doselect i;set i = i + 1;end while;
end;
while 条件 do 循环体
3.5循环结构 REPEAT
create procedure test_repeat()
begindeclare i int;set i = 1;#初始化条件repeatselect i;set i = i + 1;until i > 10end repeat;
end;
repeat至少会执行一次
3.6跳转语句 LEAVE
LEAVE 标记名
3.7跳转语句 ITERATE
相当于continue
4.游标
通过游标操作数据行上的数据
4.2游标的使用步骤
声明游标
DECLARE cursor_name CURSOR FOR
SELECT column1, column2 FROM table_name WHERE condition;
打开游标
OPEN cursor_name;
读取数据
FETCH cursor_name INTO var1, var2, ...;
关闭游标
CLOSE cursor_name;