exists如何与declare styleable配合使用

2017年5月 总版技术专家分月排行榜第二2017年3月 总版技术专家分月排行榜第二
2017年8月 总版技术专家分月排行榜第三2017年7月 总版技术专家分月排行榜第三
2017年5月 总版技术专家分月排行榜第二2017年3月 总版技术专家分月排行榜第二
2017年8月 总版技术专家分月排行榜第三2017年7月 总版技术专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。请教一下关于 DECLARE 的问题【mysql吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:40,919贴子:
请教一下关于 DECLARE 的问题收藏
由于需要遍历结果集,所以用了游标,下面的这种写法无法通过,DELIMITER $$DROP PROCEDURE IF EXISTS updateRankAndPromotion$$CREATE PROCEDURE updateRankAndPromotion(playactId INT)BEGINDECLARE strWheel CHAR(6);
DECLARE done INT DEFAULT FALSE;SELECT wheel INTO strWheel FROM playact WHERE playact_id = playactId;
DECLARE cur CURSOR FOR SELECT playact_id FROM playact WHERE red_source LIKE strNextS
#将 结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;END$$DELIMITER ;只有把 SELECT wheel INTO strWheel FROM playact WHERE playact_id = playactId; 后面的所有 DECLARE 放到 Select wheel ... 前才行,但是 游标的 select 条件需要先 select 出来,请问一下有知道如何解决的么?
来达内mysql,先培训,就业后付款,0首付,0基础入学,想学数据库就来达内!达内数据库培训,总监级讲师授课,自助研发TTS教学系统,120入门到精通
除了再写一个 procedure 供该存储过程调用
存储过程里,定义语句必须要放前面。你那个select根本不是定义语句,所以它必须在delcare后面。其次,你的两个select都是从同一张表取不同字段的数据而已,没看明白你说的“标的 select 条件需要先 select 出来”想表达什么意思
登录百度帐号推荐应用oracle(10)
解决方法 &两个&DECLARE之间加上/ &注意:/单独占用一行,且前面要顶格,无空格。
--创建容器临时表
& select count(1) into exist &from user_tables t where t.table_name = 'TEMP_YRYD_RQ';
& if exist = 0 then execute immediate 'create table TEMP_YRYD_RQ( rqid VARCHAR2(255), rqmc VARCHAR2(255), cxtj VARCHAR2(255) )';
& execute immediate 'delete from TEMP_YRYD_RQ';
--插入数据&
& select count(1) into exist &from user_tables t where t.table_name = 'TEMP_YRYD_RQ';
& if exist = 0 then execute immediate 'create table TEMP_YRYD_RQ( rqid VARCHAR2(255), rqmc VARCHAR2(255), cxtj VARCHAR2(255) )';
& execute immediate 'delete from TEMP_YRYD_RQ';
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40036次
排名:千里之外
原创:24篇
转载:28篇
评论:17条
(5)(1)(1)(5)(3)(2)(1)(1)(2)(5)(14)(12)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'正文 mysql存储过程中使用游标的实例详解
mysql存储过程中使用游标的实例详解
发布时间: & 编辑:
本文介绍下,在mysql中使用存储过程的几个例子,在存储过程中使用游标,从简单到复杂,是学习mysql存储过程的好实例,有需要的朋友不要错过。
DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
-- 存储过程名为:getUserInfo
-- 参数为:date_day日期格式:
declare _userName varchar(12); -- 用户名
declare _ -- 语文
declare _&&& -- 数学
-- 定义游标
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 获取昨天的日期
if date_day is null then
&& set date_day = date_add(now(),interval -1 day);
cursor_loop:loop
&& FETCH rs_cursor into _userName, _chinese, _ -- 取数据
&& if done=1 then
&&& leave cursor_
&& -- 更新表
&& update infoSum set total=_chinese+_math where UserName=_userN
end loop cursor_
DELIMITER ;
例2、存储过程游标循环跳出
在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作。
MySQL中的游标循环操作常用的有三种:LOOP、REPEAT、WHILE三种循环,方式大同小异。
1,REPEAT方式
复制代码 代码示例:
& UNTIL expression
END REPEAT
DECLARE num INT;
DECLARE my_string& VARCHAR(255);
SET& my_string =CONCAT(my_string,num,',');
SET& num = num +1;
& UNTIL num &5
END REPEAT;
2,WHILE方式
复制代码 代码示例:
WHILE expression DO
DECLARE num INT;
DECLARE my_string& VARCHAR(255);
SET num =1;
SET str ='';
& WHILE num& & span&10DO
SET& my_string =CONCAT(my_string,num,',');
SET& num = num +1;
END WHILE;
3,LOOP(注意其中的ITERATE,LEAVE)方式
复制代码 代码示例:
DECLARE num& INT;
DECLARE str& VARCHAR(255);
SET num =1;
SET my_string ='';
& loop_label:& LOOP
IF& num &10THEN
&&&&& LEAVE& loop_
SET& num = num +1;
IF(num mod3)THEN
&&&&& ITERATE& loop_
SET& my_string =CONCAT(my_string,num,',');
ITERATE可以理解为程序中常用的contiune;
而ITERATE就是break,当然在MySQL存储过程,需要循环结构有个名称,其它皆同。
例3,mysql 存储过程中使用多游标
先创建一张表,插入一些测试数据:
复制代码 代码示例:
DROP TABLE IF EXISTS netingcn_proc_
CREATE TABLE `netingcn_proc_test` (
& `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
& `name` VARCHAR(20),
& `password` VARCHAR(20),
& PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name, password) values
('procedure1', 'pass1'),
('procedure2', 'pass2'),
('procedure3', 'pass3'),
('procedure4', 'pass4');下面就是一个简单存储过程的例子:
drop procedure IF EXISTS test_
delimiter //
create procedure test_proc()
&-- 声明一个标志done, 用来判断游标是否遍历完成
&DECLARE done INT DEFAULT 0;
&-- 声明一个变量,用来存放从游标中提取的数据
&-- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&-- 声明游标对应的 SQL 语句
&DECLARE cur CURSOR FOR
& select name, password from netingcn_proc_
&-- 在游标循环到最后会将 done 设置为 1
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&-- 执行查询
&-- 遍历游标每一行
& -- 把一行的信息存放在对应的变量中
& FETCH cur INTO tname,
& if not done then
&& -- 这里就可以使用 tname, tpass 对应的信息了
&& select tname,
& UNTIL done END REPEAT;
-- 执行存储过程
call test_proc();
注意这里的变量的声明、游标的声明和HANDLER声明的顺序不能搞错。
必须是先声明变量,再申明游标,最后声明HANDLER。
以上储过程的例子,只使用了一个游标,那么如果要使用两个或者更多游标怎么办,其实很简单,一个怎么用两个就是怎么用的。
复制代码 代码示例:
drop procedure IF EXISTS test_proc_1;
delimiter //
create procedure test_proc_1()
&DECLARE done INT DEFAULT 0;
&DECLARE tid int(11) DEFAULT 0;
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&DECLARE cur_1 CURSOR FOR
& select name, password from netingcn_proc_
&DECLARE cur_2 CURSOR FOR
& select id, name from netingcn_proc_
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&open cur_1;
& FETCH cur_1 INTO tname,
& if not done then
&& select tname,
& UNTIL done END REPEAT;
&CLOSE cur_1;
&-- 注意这里,一定要重置done的值为 0
&set done = 0;
&open cur_2;
& FETCH cur_2 INTO tid,
& if not done then
&& select tid,
& UNTIL done END REPEAT;
&CLOSE cur_2;
call test_proc_1();
代码说明:
上述代码和第一个例子中基本一样,就是多了一个游标声明和遍历游标。
注意:在遍历第二个游标前使用了set done = 0,因为当第一个游标遍历玩后其值被handler设置为1了,如果不用set把它设置为 0 ,那么第二个游标就不会遍历了。
一个好的习惯是:在每个打开游标的操作前都用该语句,确保游标能真正遍历。
当然,还可以使用begin语句块嵌套的方式来处理多个游标。
复制代码 代码示例:
drop procedure IF EXISTS test_proc_2;
delimiter //
create procedure test_proc_2()
&DECLARE done INT DEFAULT 0;
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&DECLARE cur_1 CURSOR FOR
& select name, password from netingcn_proc_
&DECLARE cur_2 CURSOR FOR
& select id, name from netingcn_proc_
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&open cur_1;
& FETCH cur_1 INTO tname,
& if not done then
&& select tname,
& UNTIL done END REPEAT;
&CLOSE cur_1;
& DECLARE done INT DEFAULT 0;
& DECLARE tid int(11) DEFAULT 0;
& DECLARE tname varchar(50) DEFAULT NULL;
& DECLARE cur_2 CURSOR FOR
&& select id, name from netingcn_proc_
& DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
& open cur_2;
&& FETCH cur_2 INTO tid,
&& if not done then
&&& select tid,
&& UNTIL done END REPEAT;
& CLOSE cur_2;
call test_proc_2();您可能感兴趣的文章:}

我要回帖

更多关于 declare 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信