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装置上本地运行)
即使在复制粘贴中找到的示例时

我得到: 错误代码:1064

您的SQL语法有错误; 检查相应的手册 您的MySQL服务器版本 使用near'DECLARE done'的正确语法 INT默认值为0;为声明cur游标 从视点中选择uid;'排队 一,


天哪,这太难了…

你忘了将分隔符重置为
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 ;
//