错误delcare游标mysql存储过程

时间:2016-09-06 15:07:51

标签: mysql sql cursor procedure

我有下一个存储过程,我在使用游标之前已经在mysql中创建了其他程序但是我这样,mysql发给我一个错误:程序是下一个:

DROP PROCEDURE IF EXISTS systm;

delimiter //

CREATE PROCEDURE systm()
BEGIN
    DECLARE bdone INT;
    DECLARE var1 VARCHAR(250);
    DECLARE var2 VARCHAR(250);
    DECLARE puntero VARCHAR(5);


    SET @query = CONCAT('CREATE TABLE IF NOT EXISTS `wg_init` (
                         `id` int(10) NOT NULL AUTO_INCREMENT,
                         `nombre` varchar(200) NOT NULL,
                         `valor` varchar(500) NOT NULL,
                          PRIMARY KEY (`id`)
                        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;');

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    DECLARE curs CURSOR FOR SELECT `nombre` FROM `wg_datos`;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

    OPEN curs;

    SET bdone = 0;
    REPEAT
      FETCH curs INTO puntero;

      SET @slt = CONCAT( 'SELECT nombre,valor INTO var1,var2 FROM wg_datos WHERE id =',puntero,'and nombre NOT LIKE "%descripcion%" ' ); 
      PREPARE stmt FROM @slt;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;

      SET @query = CONCAT('INSERT INTO wg_init(nombre,valor) VALUES (',var1,',',var2,' ) ');

      PREPARE stmt FROM @query;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;

    UNTIL bdone END REPEAT;
    CLOSE curs;
END
//

delimiter ;

CALL systm();

程序很简单,必须做下一步:

首先,创建一个表,之后,另一个查询通过游标获取id获取id,每行,它从fetch游标获取的id中选择(nombre,valor)并在新的中执行插入具有之前获得的值的表。这很简单但是mysql给我发错了:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
near 'DECLARE curs CURSOR FOR SELECT `nombre` FROM `wg_datos`;

DECLARE CONT' at line 15 

我试图执行查询:

SELECT nombre FROM wg_datos

并且工作正常。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

首先,我不明白为什么你需要一个游标循环来处理设置的RBAR(逐行排列),为什么你不能一下子完成这个。

然后,不清楚为什么从wg_datos获取id,然后在nombre列的等式谓词中使用该值。

并且id的值被提取到VARCHAR(5)变量中。我们没有看到wg_datos的数据类型位于nombre

目前还不清楚这个存储过程应该实现什么,我认为这些问题比DECLARE语句的语法问题要深刻得多。

如果我们执行游标循环,并将id的值提取到VARCHAR(5)中,然后在与SELECT v.nombre , v.valor FROM wg_datos i JOIN wg_datos v ON v.id = SUBSTRING(i.nombre,1,5) AND v.nombre NOT LIKE '%descripcion%' 列的比较中使用该值... SELECT .. 。如果返回多行,INTO ...将抛出错误...

这一切看起来都很奇怪。看起来该过程将处理一个类似于查询返回的集合,如下所示:

SELECT ... INTO ...

当然,与程序的不同之处在于INSERT没有返回一行,程序仍然会处理wg_datos语句。

非常奇怪。

除了bizzare代码之外,我还不知道这个程序实际上应该完成什么。

如果目的是简单地将行从wg_init复制到id,则排除包含字符串"描述"的行。在nombre中,并为wg_init中的行分配新的auto_increment CREATE PROCEDURE systm() BEGIN SET @query = CONCAT('CREATE TABLE IF NOT EXISTS `wg_init` ( `id` int(10) NOT NULL AUTO_INCREMENT, `nombre` varchar(200) NOT NULL, `valor` varchar(500) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; INSERT INTO wg_init(nombre,valor) SELECT d.nombre , d.valor FROM wg_datos d WHERE d.nombre NOT LIKE '%descripcion%' ; END$$ DELIMITER ; 值...

let span = MKCoordinateSpanMake(0.014, 0.014)
let region = MKCoordinateRegion(center: location, span: span)
mapView.setRegion(region, animated: true)