为什么mysql不允许获取游标中的用户定义变量?
我有这样的代码,mysql发布了一个错误: 行:为什么mysql不允许获取游标中的用户定义变量?,mysql,stored-procedures,database-cursor,Mysql,Stored Procedures,Database Cursor,我有这样的代码,mysql发布了一个错误: 行:fetchcur\u recycle\u batch进入@id、@created\u by、@created\u date发布错误 有人知道为什么mysql不允许获取用户定义的变量吗 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_row`() BEGIN DECLARE done TINYINT DEFAULT FALSE; DECLARE cur_recycle_ba
fetchcur\u recycle\u batch进入@id、@created\u by、@created\u date代码>发布错误
有人知道为什么mysql不允许获取用户定义的变量吗
CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_row`()
BEGIN
DECLARE done TINYINT DEFAULT FALSE;
DECLARE cur_recycle_batch CURSOR FOR SELECT
id, created_by, created_date
FROM
outsourcing_recycle_batch
order by created_date;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
START transaction;
OPEN cur_recycle_batch;
insert_loop : loop
FETCH cur_recycle_batch INTO @id, @created_by, @created_date;
IF done THEN
LEAVE insert_loop;
END IF;
INSERT INTO `test_db`.`outsourcing_recycle_batch_history_list`
(`outsourcing_recycle_batch_pk`,
`outsourcing_history_pk`,
`created_by`,
`created_by_full_name`,
`created_date`)
VALUES
(@id,
1,
@created_by,
'AAAAAAAA',
@created_date);
END LOOP;
CLOSE cur_recycle_batch;
commit;
END
有一个解决方法:声明
局部变量,而不是依赖用户变量
CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_row`()
BEGIN
DECLARE local_id INT;
DECLARE local_created_by VARCHAR(20);
DECLARE local_created_date DATE;
DECLARE done TINYINT DEFAULT FALSE;
DECLARE cur_recycle_batch CURSOR FOR SELECT id, created_by, created_date
FROM outsourcing_recycle_batch
ORDER BY created_date;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
START transaction;
OPEN cur_recycle_batch;
insert_loop : loop
FETCH cur_recycle_batch INTO local_id, local_created_by, local_created_date;
IF done THEN
LEAVE insert_loop;
END IF;
INSERT INTO `test_db`.`outsourcing_recycle_batch_history_list`
(`outsourcing_recycle_batch_pk`,
`outsourcing_history_pk`,
`created_by`,
`created_by_full_name`,
`created_date`)
VALUES
(local_id,
1,
local_created_by,
'AAAAAAAA',
local_created_date);
END LOOP;
CLOSE cur_recycle_batch;
commit;
END
考虑到这种解决方法,将FETCH实现到用户变量中肯定从来没有优先权
CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_row`()
BEGIN
DECLARE local_id INT;
DECLARE local_created_by VARCHAR(20);
DECLARE local_created_date DATE;
DECLARE done TINYINT DEFAULT FALSE;
DECLARE cur_recycle_batch CURSOR FOR SELECT id, created_by, created_date
FROM outsourcing_recycle_batch
ORDER BY created_date;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
START transaction;
OPEN cur_recycle_batch;
insert_loop : loop
FETCH cur_recycle_batch INTO local_id, local_created_by, local_created_date;
IF done THEN
LEAVE insert_loop;
END IF;
INSERT INTO `test_db`.`outsourcing_recycle_batch_history_list`
(`outsourcing_recycle_batch_pk`,
`outsourcing_history_pk`,
`created_by`,
`created_by_full_name`,
`created_date`)
VALUES
(local_id,
1,
local_created_by,
'AAAAAAAA',
local_created_date);
END LOOP;
CLOSE cur_recycle_batch;
commit;
END
举个例子,还有一个更简单的解决方法:根本不使用光标,只使用插入一组行
CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_row`()
BEGIN
INSERT INTO `test_db`.`outsourcing_recycle_batch_history_list`
(`outsourcing_recycle_batch_pk`,
`outsourcing_history_pk`,
`created_by`,
`created_by_full_name`,
`created_date`)
SELECT id, 1, created_by, 'AAAAAAAA', created_date
FROM outsourcing_recycle_batch;
END
我不知道你是否简化了你的例子。您可能需要使用光标对值进行其他逐行操作,而不是简单地插入。基本上这似乎是一个设计问题。在这种情况下使用a有什么特殊原因吗?。还要检查函数:。我在问题中使用了声明变量。我最初使用用户定义变量是为了节省几行代码,但我很好奇为什么mysql不允许这样做。在这种情况下,最后一个插入ID是正确的。谢谢你的建议。