【MySQL】存储过程 —— 条件处理程序 —— handle

一、介绍

条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:

-- for后面跟上的就是条件,满足什么样的条件我才执行handle这个动作
-- statement:具体的SQL逻辑
DECLARE handler_action HANDLER FOR condition_value [, condition_value]... statement; 

handler_action 的取值:  
    CONTINUE: 继续执行当前程序
    EXIT: 终止执行当前程序
condition_value 的取值: 
    SQLSTATE  sqlstate_value: 状态码,如 02000 -- 当我们执行SQL的时候,它抛出的SQL语句的状态码来决定到底执行continue还是exit
    SQLWARNING: 所有以01开头的SQLSTATE代码的简写,SQL警告
    NOT FOUND: 所有以02开头的SQLSTATE代码的简写,没有找到
    SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写

具体的错误状态码,可以参考官方文档:

MySQL官方文档中就描述了,每一种状态码它的含义

https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html

https://dev.mysql.com/doc/refman/8.0/en/declare-handler.html

例如02000:抓取的时候没有数据,02开头的在MySQL中指代的就是没有数据,在条件处理程序中它给我们简写成NOT FOUND

image-20240720154259302


二、案例

我们继续来完成在上一小节提出的这个需求,并解决其中的问题。

根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名 (name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表 (id,name,profession)中。

A. 通过SQLSTATE指定具体的状态码

-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游标
create procedure p11(in uage int)
begin
  declare uname varchar(100);
  declare upro varchar(100);
  declare u_cursor cursor for select name,profession from tb_user where age <= uage;
  -- 声明条件处理程序:当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
  -- 所以即使我们进行while true循环,循环如果抓取不到数据,它就会进行报错,报了错后它就会进入到我们的条件处理程序,在条件处理程序中它会关闭游标,然后执行退出操作
  declare exit handler for SQLSTATE '02000' close u_cursor;
  
  drop table if exists tb_user_pro;
  create table if not exists tb_user_pro(
    id int primary key auto_increment,
    name varchar(100),
    profession varchar(100)
  );
  
  open u_cursor;
  while true do
    fetch u_cursor into uname,upro;
    insert into tb_user_pro values (null, uname, upro);
  end while;
  close u_cursor;
end;

call p11(30);

B. 通过SQLSTATE的代码简写方式 NOT FOUND

02 开头的状态码,代码简写为 NOT FOUND

create procedure p12(in uage int)
begin
    declare uname varchar(100);
    declare upro varchar(100);
    declare u_cursor cursor for select name,profession from tb_user where age <= uage;
    -- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02开头时,将关闭游标u_cursor,并退出
    declare exit handler for not found close u_cursor;
    drop table if exists tb_user_pro;
    create table if not exists tb_user_pro(
      id int primary key auto_increment,
      name varchar(100),
      profession varchar(100)
    );
    open u_cursor;
    while true do
            fetch u_cursor into uname,upro;
            insert into tb_user_pro values (null, uname, upro);
        end while;
    close u_cursor;
end;
call p12(30);
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值