/*删除函数*/ drop function if exists fun1; /*声明结束符为$*/ delimiter $ /*创建函数*/ create function fun1(v_max_a int) returns int begin /*用于保存结果*/ declare v_total int default 0; /*创建一个变量,用来保存当前行中a的值*/ declare v_a int default 0; /*创建一个变量,用来保存当前行中b的值*/ declare v_b int default 0; /*创建游标结束标志变量*/ declare v_done int default false; /*创建游标*/ declare cur_envy1 cursor for select a,b from envy1 where a<=v_max_a; /*设置游标结束时v_done的值为true,使用v_done来判断游标是否结束了*/ declare continue handler for not found set v_done=true; /*设置v_total初始值*/ set v_total = 0; /*打开游标*/ open cur_envy1; /*使用Loop循环遍历游标*/ a:loop /*先获取当前行的数据,然后将当前行的数据放入v_a,v_b中,如果当前行无数据,v_done会被置为true*/ fetch cur_envy1 into v_a, v_b; /*通过v_done来判断游标是否结束了,退出循环*/ if v_done then leave a; end if; /*对v_total值进行累加处理*/ SET v_total = v_total + v_a + v_b; end loop; /*关闭游标*/ close cur_envy1; /*返回结果*/ return v_total; end $ /*结束符置为;*/ delimiter ;
/*删除存储过程*/ drop procedure if exists proc1; /*声明结束符为$*/ delimiter $ /*创建存储过程*/ create procedure proc1() begin /*创建一个变量,用来保存当前行中a的值*/ declare v_a int default 0; /*创建游标结束标志变量*/ declare v_done1 int default false; /*创建游标*/ declare cur_envy2 cursor for select a from envy2; /*设置游标结束时v_done1的值为true,可以v_done1来判断游标cur_envy2是否结束了*/ declare continue handler for not found set v_done1=true; /*打开游标*/ open cur_envy2; /*使用Loop循环遍历游标*/ a:loop fetch cur_envy2 into v_a; /*通过v_done1来判断游标是否结束了,退出循环*/ if v_done1 then leave a; end if;
begin /*创建一个变量,用来保存当前行中b的值*/ declare v_b int default 0; /*创建游标结束标志变量*/ declare v_done2 int default false; /*创建游标*/ declare cur_envy3 cursor for select b from envy3; /*设置游标结束时v_done1的值为true,可以v_done1来判断游标cur_envy3是否结束了*/ declare continue handler for not found set v_done2=true;
/*打开游标*/ open cur_envy3; /*使用Loop循环遍历游标*/ b:loop fetch cur_envy3 into v_b; /*通过v_done1来判断游标是否结束了,退出循环*/ if v_done2 then leave b; end if;
/*将v_a、v_b插入envy1表中*/ insert into envy1 values(v_a,v_b); end loop b; /*关闭cur_envy3游标*/ close cur_envy3; end;
end loop; /*关闭游标cur_envy2*/ close cur_envy2; end $ /*结束符置为;*/ delimiter ;