欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > mysql 变量,流程控制与游标

mysql 变量,流程控制与游标

2025/1/16 2:40:17 来源:https://blog.csdn.net/2402_86577162/article/details/145147891  浏览:    关键词:mysql 变量,流程控制与游标

第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 用户变量

  • 会话用户变量: 作用域和会话变量一样,只对当前连接会话有效

  • 局部变量: 只在BEGINEND语句块中有效.

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;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com