由于在做项目的时候遇到了,需要能遍历表的触发器,但是对语法不是很熟悉,今天就在这个做个笔记,也一起研究研究,大家有什么问题都可以提,我能jie。下面是完整示例代码,并加了注释:
1.使用游标的方法遍历—repeat until
drop trigger if exists `saa`;
/*创建一个触发器*/
create trigger `saa` after insert on `user` for each row
begin
declare done int default 0;/*判断循环是否关闭的标志位*/
declare prd_id varchar(255);
declare prd_u_name varchar(255);
declare prd_u_login_id varchar(255);
/*定义游标 以及赋值 如果多个值就注意下游标取值 ***/
declare result cursor for select id,u_name,u_login_id from user;
/*定义异常处理 */
declare continue handler for not found set done = 1;
/*打开游标*/
open result ;
/*循环开始*/
repeat
/*提取游标的值 多个值的时候: fetch xxx into xxx,xxx 按照定义游标result里值的顺序赋值*/
fetch result into prd_id,prd_u_name,prd_u_login_id;
select prd_id,prd_u_name,prd_u_login_id;
/*TODO 获取用户信息,存保存到另一张表*/
insert into online(u_id,u_name,u_login_id) values(prd_id,prd_u_name,prd_u_login_id);
until done = 1
end repeat ;/*关闭循环*/
close result ;/*关闭游标*/
end;
2.使用游标的方法遍历—loop##
begin
/*定义属性*/
declare done int default 0;/*判断循环是否关闭的标志位*/
declare prd_id varchar(255);
declare prd_u_name varchar(255);
declare prd_u_login_id varchar(255);
/*定义游标 以及赋值 如果多个值就注意下游标取值 ***/
declare result cursor for select id,u_name,u_login_id from user;
/*定义异常处理 */
declare continue handler for not found set done = 1;
/*打开游标*/
open result ;
/*循环开始*/
flag_loop:loop
/*如果 done==1 有异常 结束循环*/
if done = 1 then leave flag_loop; end if;
/*提取游标的值 多个值的时候: fetch xxx into xxx,xxx 按照定义游标result里值的顺序赋值*/
fetch result into prd_id,prd_u_name,prd_u_login_id;
select prd_id,prd_u_name,prd_u_login_id;
/*TODO 获取用户信息,存保存到另一张表*/
insert into online(u_id,u_name,u_login_id) values(prd_id,prd_u_name,prd_u_login_id);
end loop; /*循环结束*/
close result ;/*关闭游标*/
end
3.使用游标的方法遍历—while do##
语法:[label:]while 条件 do /TODO/ end while [label]
begin
/*定义属性*/
declare done int default 0;/*判断循环是否关闭的标志位*/
declare prd_id varchar(255);
declare prd_u_name varchar(255);
declare prd_u_login_id varchar(255);
/*定义游标 以及赋值 如果多个值就注意下游标取值 ***/
declare result cursor for select id,u_name,u_login_id from user;
/*定义异常处理 */
declare continue handler for not found set done = 1;
/*打开游标*/
open result ;
/*循环开始*/
flag_loop:loop
/*如果 done==1 有异常 结束循环*/
if done = 1 then leave flag_loop; end if;
/*提取游标的值 多个值的时候: fetch xxx into xxx,xxx 按照定义游标result里值的顺序赋值*/
fetch result into prd_id,prd_u_name,prd_u_login_id;
select prd_id,prd_u_name,prd_u_login_id;
/*TODO 获取用户信息,存保存到另一张表*/
insert into online(u_id,u_name,u_login_id) values(prd_id,prd_u_name,prd_u_login_id);
end loop; /*循环结束*/
/*循环开始*/
flag_while:while done=0 do
/*声明结束的时候*/
if done=1 then leave flag_while ; end if ;
/*提取游标的值 多个值的时候: fetch xxx into xxx,xxx 按照定义游标result里值的顺序赋值*/
fetch result into prd_id,prd_u_name,prd_u_login_id;
select prd_id,prd_u_name,prd_u_login_id; -- 控制台打印
/*TODO 获取用户信息,存保存到另一张表*/
insert into online(u_id,u_name,u_login_id) values(prd_id,prd_u_name,prd_u_login_id);
end while flag_while; /*循环结束*/
close result ;/*关闭游标*/
end
总结
其实 loop 跟while 的用法都差不多,repeat 的就小心点了,游标循环取值会有点麻烦。。。祝大家学习愉快!