MySql游标-创建过程
我第一次尝试创建一个光标。我已经看过文档,我理解了这个概念,但我甚至不能声明它 我正在使用:MySql游标-创建过程,mysql,cursor,mysql-error-1064,Mysql,Cursor,Mysql Error 1064,我第一次尝试创建一个光标。我已经看过文档,我理解了这个概念,但我甚至不能声明它 我正在使用: MySql 5.1.41 SqlYog作为管理者 (在xampp装置上本地运行) 即使在复制粘贴中找到的示例时 我得到: 错误代码:1064 您的SQL语法有错误; 检查相应的手册 您的MySQL服务器版本 使用near'DECLARE done'的正确语法 INT默认值为0;为声明cur游标 从视点中选择uid;'排队 一, 天哪,这太难了…你忘了将分隔符重置为NOT delimiter ## .
- MySql 5.1.41
- SqlYog作为管理者
- (在xampp装置上本地运行)
天哪,这太难了…你忘了将分隔符重置为
NOT代码>
delimiter ##
...
end##
需要在分隔符后面加空格
并且结束结束
不需要代码>我需要做同样的事情,因此我最终编写了一个存储过程来完成这项工作。我把它包括在这里,它在MySQL工作台上运行得非常好。有趣的是,它不会在Navicat上正确运行,因为原始select语句不会忽略空值,因此会删除所有索引
我建议您通读代码,并将一些内容分解出来,然后分别运行它们,这样您就可以确定它将实现您想要的功能
按照编写方式,它应该删除给定连接中所有数据库中的每个外键。除非你想这样做,否则不要按原样运行
使用风险自负。
--这是一个在存储过程中正确实现游标的示例。--我在创建存储过程时总是遇到这个错误。太蠢了,原来我没有创建程序的权限。除非您以root用户身份登录,否则您需要指定创建前创建的每个过程的名称,并授予对该过程的访问权。是的,但我是以root身份登录的,在分隔符后面加一个空格是我个人的习惯,结尾END
不需要代码>祝你一切顺利,谢谢谢谢谢谢谢谢Hanks,它与示例查询一起工作。不知何故,我认为我在以同样的方式做每件事,但我无法让我的查询工作。我将编辑我的主要帖子,如果你可以的话,请检查一下。非常感谢,但我甚至不再使用mySql了:)
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;##
delimiter ##
...
end##
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
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 ;
//