我第一次尝试创建一个光标。我看过文档,我理解这个概念,但我似乎无法让它被声明.
我在用:
manager
即使在复制粘贴在http://dev.mysql.com/doc/refman/5.1/en/cursors.html中找到的示例时
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
OPEN cur2;
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
CLOSE cur1;
CLOSE cur2;
END;
我马上收到错误:错误代码: 1064
您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以便在第3行使用正确的语法
还有一群人跟着,
这对我来说没有任何意义,任何善良的灵魂能帮我吗?
谢谢
因此,通过重置划界器,我得到了示例查询(感谢ajreal)。但是当我运行我的查询时:
DELIMITER##
CREATE PROCEDURE RetiraPoints()
BEGIN
DECLARE userid BIGINT;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT uid FROM viewpoints;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO userid;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO points (iduser, points, pointcat) VALUES (uid, -1, 1), (userid, -1, 2), (userid, -1, 3), (userid, -1, 4), (userid, -1, 5), (userid, -1, 6);
END LOOP;
CLOSE cur;
END;##
我得到:错误代码: 1064
您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,在第1行使用的语法接近于“声明已完成的INT默认值0;从视图中为选择uid声明cur游标”;
天啊,这很难.
发布于 2011-01-06 05:27:38
忘记将分隔符重置为NOT ;
delimiter ##
...
end##
需要在分隔符后面放一个空格
而结尾的END
不需要;
发布于 2013-03-21 13:58:26
我需要做同样的事情,所以我最终编写了一个存储过程来完成这项工作。我已经将它包含在这里,它在MySQL工作台上运行得很好。有趣的是,它将而不是正确地运行在Navicat上,因为原始的select语句不会省略空值,因此会删除所有索引。
我建议您阅读这段代码,并将几件事情分开运行,这样您就可以确保它能做您想做的事情。
按照编写的方式,它应该删除给定连接中所有数据库中的每个外键。除非这是你想要做的事,否则不要按原样运行。
自担风险使用.
DELIMITER $$
CREATE PROCEDURE `pRemoveAllForeignKeys`()
BEGIN
DECLARE sName TEXT;
DECLARE cName TEXT;
DECLARE tName TEXT;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT TABLE_SCHEMA, CONSTRAINT_NAME, TABLE_NAME
FROM information_schema.key_column_usage
WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL
-- AND TABLE_SCHEMA = 'NameOfAParticularSchema' -- use this line to limit the results to one schema
-- LIMIT 1 -- use this the first time because it might make you nervous to run it all at once.
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO sName, cName, tName;
IF done THEN
LEAVE read_loop;
END IF;
SET @s = CONCAT('ALTER TABLE ',sName, '.', tName, ' DROP FOREIGN KEY ', cName);
-- SELECT @s; -- uncomment this if you want to see the command being sent
PREPARE stmt FROM @s;
EXECUTE stmt;
END LOOP;
CLOSE cur;
deallocate prepare stmt;
END
发布于 2020-07-28 04:03:37
create or replace procedure cursor_sample()
BEGIN
DECLARE done int default 0 ;
DECLARE data1 varchar(20) ;
DECLARE data2 int ;
DECLARE cur1 CURSOR FOR
select sname,examscore from student ;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done = 1 ;
OPEN cur1;
loop1:LOOP
FETCH cur1 into data1,data2 ;
insert into student_log(user_name,score) values (data1,data2) ;
if done = 1 THEN
LEAVE loop1 ;
END IF ;
END LOOP;
CLOSE cur1;
END ;
//
--这是存储过程中正确的游标实现的一个例子.--
https://stackoverflow.com/questions/4615193
复制