mysql高级【2】:mysql游标、异常错误处理、存储函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26584263/article/details/82147592

由于都是简单的使用,所以我直接把三个知识点都写入了一个例子里了,使用的数据库是上一次博客新建的数据库

https://blog.csdn.net/qq_26584263/article/details/82116667

1、问题:

有个用户表,新增的时候如果存在id已经存在了那么就返回 “用户id已存在!”,查询全部数据的名字和年龄段字符串,年龄段为

童年: 0岁—6岁

少年: 7岁—17岁

成年:大于等于18岁

假如有数据:

张三丰 12岁

李思 22岁

返回的数据就应该是

张三丰在少年阶段;李思在成年阶段

2、解决问题:

(1)、首先新建一个存储函数,判断不同年龄的阶段的值  ageDegree函数,函数和java中的函数差不多,判断完后返回结果,存储函数里面是可以使用sql语句的。

CREATE  FUNCTION `ageDegree`(age int) RETURNS varchar(50)
    DETERMINISTIC
begin
      declare str varchar(50);
      if age < 7 then
      set str = "童年";
      elseif age < 18 then
      set str = "少年";
      else
      set str = "成年";
      end if;
      return (str);
      end

(2)、写存储结构

CREATE PROCEDURE `demo1`(in id int,in name varchar(20), inout result varchar(1000))
BEGIN

declare nameeages varchar(20) default ""; //保存每一次遍历得到的值
declare counts int default  1;//定义游标数据为1
declare primarykeynum condition for 1062;//mysql数据库中1062是主键已存在的异常
declare newcursor cursor for
select concat(user_name,"在",agedegree(user_age),"阶段") from user;//定义游标
declare exit handler for not found set counts := 0;//当遍历到数据不存在时触发该操作退出
declare exit handler for primarykeynum select '用户id已存在!' as result;//当主键已有触发该操作退出
 
 if(id = 128) then  //自定义错误异常
 signal sqlstate '45000' 
 set message_text = '该账号已经有人预定了,无法添加哦';
 end if;
 
insert into user
(user_id,
user_name,
user_age,
user_password,
user_money,
user_create_time)
values(id,name,12,"123456",23,now());//新增数据操作

open newcursor;//打开游标
while counts != 0 do//遍历游标
fetch newcursor into nameeages;//把游标里面的值复制给nameeages
set result := concat(result,nameeages);//拼接字符串
end while;
close newcursor;//关闭游标

END

3.调用测试查看结果

首相要set @result = "";

(1)数据库中有user_id 的数据,所以使用call demo1(1,"测试",@result);结果为:

mysql> call demo1(1,"测试",@result); //
+----------------+
| result         |
+----------------+
| 用户id已存在! |
+----------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

(2)使用user_id为128的,call demo1(128,"测试",@result); 结果为:

mysql> call demo1(128,"测试",@result);
ERROR 1644 (45000): 该账号已经有人预定了,无法添加哦

(3)使用可以新增的, call demo1(1288,"测试",@result);
mysql> call demo1(1288,"测试",@result); //
Query OK, 0 rows affected (0.07 sec)
    -> ^C
mysql> select @result;
+----------------------------------------------------------------------------------------------+
| @result                                                                                      |
+----------------------------------------------------------------------------------------------+
| 张三在成年阶段,李四在成年阶段,王五在成年阶段,赵无极在成年阶段,甜心在成年阶段,测试在少年阶段, |
+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4、注意要点:

(1)、错误总是映射到一个MySQL错误代码,因为在MySQL中它是最具体的。 SQLSTATE可以映射到许多MySQL错误代码,因此它不太具体。 SQLEXCPETIONSQLWARNINGSQLSTATES类型值的缩写,因此它是最通用的。

(2)、存储过程在使用存储函数时可读性更高。请注意,存储函数仅返回单个值。 如果没有包含INTO子句的SELECT语句,则将会收到错误。另外,如果存储的函数包含SQL语句,则不应在其他SQL语句中使用它; 否则,存储的函数将减慢查询的速度。

(3)、处理程序声明必须出现在存储过程中的变量和游标声明之后。

(4)、条件声明必须出现在处理程序或游标声明之前。

<_^-^__^-^__^-^__^-^__^-^__^-^__^-^__菜鸟学习中,有什么不对请多多指教__^-^__^-^__^-^__^-^__^-^__^-^__^-^_>

猜你喜欢

转载自blog.csdn.net/qq_26584263/article/details/82147592
今日推荐