由于都是简单的使用,所以我直接把三个知识点都写入了一个例子里了,使用的数据库是上一次博客新建的数据库
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错误代码,因此它不太具体。 SQLEXCPETION
或SQLWARNING
是SQLSTATES
类型值的缩写,因此它是最通用的。
(2)、存储过程在使用存储函数时可读性更高。请注意,存储函数仅返回单个值。 如果没有包含INTO
子句的SELECT
语句,则将会收到错误。另外,如果存储的函数包含SQL语句,则不应在其他SQL语句中使用它; 否则,存储的函数将减慢查询的速度。
(3)、处理程序声明必须出现在存储过程中的变量和游标声明之后。
(4)、条件声明必须出现在处理程序或游标声明之前。
<_^-^__^-^__^-^__^-^__^-^__^-^__^-^__菜鸟学习中,有什么不对请多多指教__^-^__^-^__^-^__^-^__^-^__^-^__^-^_>