我有下一个存储过程,我在使用游标之前已经在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
并且工作正常。
任何人都可以帮助我吗?
答案 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)