mysql 变量,流程控制与游标

第16章_变量,流程控制与游标

1.变量

分为系统变量用户自定义变量

1.1系统变量

1.1.1系统变量分类

系统变量分为全局系统变量以及会话系统变量

查看所有全局变量

SHOW GLOBAL VARIABLES

查看所有会话变量

SHOW SESSION VARIABLES
    or
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)
BEGIN
    DECLARE 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 THEN
        IF salary < 8000 THEN
            UPDATE 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)
begin
    case v1
        when 1 then
            select 'v1=1';
        when 2 then
            select 'v1=2';
        when 3 then
            select 'v1=3';
        else
            select 'v1不等于1,2,3';
    end case;
end;

3.3循环结构 LOOP

create procedure update_salary_loop(out num int)
begin
    declare avg_salary double;
    declare loop_count int default 0;
    select avg(salary) into avg_salary from employees;
    loop_label:loop
        if avg_salary <12000 then
            update employees set salary = salary*1.1;
            elseif avg_salary >=12000 then
            leave 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()
begin
    declare i int;
    set i = 1;
    while i <= 10 do
        select i;
        set i = i + 1;
    end while;
end;

while 条件 do 循环体

3.5循环结构 REPEAT

create procedure test_repeat()
begin
    declare i int;
    set i = 1;#初始化条件
    repeat
        select i;
        set i = i + 1;
    until i > 10
    end 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;

你可能感兴趣的:(mysql,数据库)