一套完整新媒体运营方案,关键词搜索引擎优化推广,wordpress 登录挂件,响应式购物网站设计mysql游标动态传参实现#xff08;动态游标#xff09; 1.问题2.需求描述3.实现3.1.使用3.2.代码#xff08;直接看这都可以#xff09; 1.问题 众所周知#xff0c;mysql存储过程功能是没有oracle的包功能强大的#xff0c;但是在去O的趋势下#xff0c;mysql存储过程的… mysql游标动态传参实现动态游标 1.问题2.需求描述3.实现3.1.使用3.2.代码直接看这都可以 1.问题 众所周知mysql存储过程功能是没有oracle的包功能强大的但是在去O的趋势下mysql存储过程的编写还是要掌握的。今天在编写mysql存储过程的时候就遇到一个问题可能是先入为主的思想同事之前说过mysql的存储过程很难用游标都不能使用oracle那种动态传参实现动态遍历结果集内容。我也就一直以为mysql的邮编只能在begin的DECLARE最后的部分进行一次确切的sql声明但是很多时候我并不能事先确定每一个字段的范围这样游标就很鸡肋了。搜了许久没有找到相关博库难道是我搜索方式不对那我就来水一篇博客了~
2.需求描述 现在想要在存储过程中间遍历某个游标这个游标实际是查一个表ib_tbs_prepareduty ,这个表有一个ftaskid字段这个字段的值我不能在声明游标的时候确定我可能在存储过程中间某一部分处理后才能得到这个时候我们该怎么declare游标又怎么让游标准确拿到这部分我想要的记录呢 如果是oracle就好了我可以像函数一样定义游标然后open游标接着遍历就可以了。
DECLARE r_emp emp%ROWTYPE; --该类型为emp表中一行的类型 cursor c_emp(v_no number) is SELECT * FROM emp where deptno v_no;
BEGIN OPEN c_emp(20); --给v_no传参20LOOP FETCH c_emp into r_emp ; --游标中查询出来的一行into进定义的变量r_emp中 EXIT WHEN c_emp%NOTFOUND; dbms_output.put_line(员工姓名 || r_emp.ename ); END LOOP; CLOSE c_emp;
END;3.实现
3.1.使用 其实mysql的游标也是可以传参数的只不过定义和传参的时候和oracle的带参数的游标有一点不同但是使用的时候就和普通的静态游标一模一样了。 首先是定义 接着是或者parameter并赋值然后游标在open的时候就会执行具体的sql拿到我们要的结果集最后使用循环进行遍历就可以了。 起始就是比静态游标的时候多一个传参比如倒数第二个游标cur_bq就是静态游标 废话不多说直接上代码
3.2.代码直接看这都可以
CREATE DEFINERroot% PROCEDURE p_prepareduty({你的入参和出参数})
BEGIN#下面定义一些变量用来存你要从游标中取出的字段内容DECLARE for_i int DEFAULT 0;DECLARE cur_fid VARCHAR(50);DECLARE cur_fdate date;DECLARE cur_fcityno VARCHAR(20);DECLARE cur_foverseas VARCHAR(200);DECLARE cur_freason VARCHAR(50);DECLARE cur_fspecial text;DECLARE var_ftaskid VARCHAR(50);#你的其他变量DECLARE done INT DEFAULT 0;#用于退出LOOP循环#DECLARE最后部分是定义你的游标可以定义静态和动态游标declare cur_bq cursor for select fid,fdate,fcityno,foverseas,freason,fspecial from ib_tbs_prepareduty where ftaskid ls_ftaskid and fempid ls_fempid and fifvalid 1;#静态declare cur_lastbq cursor for select fcityno,foverseas,freason,fspecial from ib_tbs_prepareduty where fempid ls_fempid and fifvalid 1 and ftaskid parameter;#动态#parameter是域变量也就是游标的参数declare continue handler for not found set done 1;{这里处理你的业务并且获得你需要的parameter的值}#下面演示动态游标使用SET parameter var_ftaskid;#给动态游标传参open cur_lastbq;#打开游标read_loop:LOOP#循环遍历fetch cur_lastbq into cur_fcityno,cur_foverseas,cur_freason,cur_fspecial;#取出你要的字段IF done 1 THEN LEAVE read_loop;END IF;#游标遍历完后退出循环{你的其他操作}END LOOP read_loop; close cur_lastbq;#关闭游标#下面演示静态游标使用open cur_bq;lable1:loopfetch cur_bq into cur_fid,cur_fdate,cur_fcityno,cur_foverseas,cur_freason,cur_fspecial;IF done 1 THEN LEAVE lable1;END IF;{你的其他操作}end loop lable1;close cur_bq;
END