gpt4 book ai didi

mysql - 错误声明游标mysql存储过程

转载 作者:行者123 更新时间:2023-11-29 03:23:58 26 4
gpt4 key购买 nike

我有下一个存储过程,我之前用游标在 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中选择(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

并且工作正常。

谁能帮帮我?

最佳答案

首先,我不明白为什么你需要一个游标循环来处理集合 RBAR(逐行痛苦),为什么你不一次性完成这个。

再一次,不清楚为什么要从 wg_datos 获取 nombre,然后在与 id 的相等谓词中使用该值专栏。

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

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

如果我们执行游标循环,并将 nombre 的值提取到 VARCHAR(5) 中,然后使用该值与 id 列进行比较。 .. 如果返回多行,则 SELECT ... INTO ... 将抛出错误...

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

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 ... 没有返回行,该过程仍将处理 INSERT声明。

很奇怪。

除了奇怪的代码之外,我不知道这个过程实际上应该完成什么。


如果目的是简单地将行从 wg_datos 复制到 wg_init,排除在 nombre 中包含字符串“descripcion”的行,并分配新的 auto_increment id wg_init 中行的值...

 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 ;

关于mysql - 错误声明游标mysql存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39352351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com