Mysql-存储过程输出变量返回null
我的表格结构是:Mysql-存储过程输出变量返回null,mysql,variables,stored-procedures,null,out,Mysql,Variables,Stored Procedures,Null,Out,我的表格结构是: DROP TABLE IF EXISTS `child`; CREATE TABLE `child` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `map_parent_child`; CREATE TAB
DROP TABLE IF EXISTS `child`;
CREATE TABLE `child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `map_parent_child`;
CREATE TABLE `map_parent_child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL,
`child_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_parent_child` (`parent_id`,`child_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `parent`;
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我创建了一个存储过程,如
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_parent`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_parent`(
IN parent_name VARCHAR(255),
IN child_name VARCHAR(255),
OUT parent_id INT(11))
BEGIN
DECLARE parent_id INT DEFAULT 0;
DECLARE child_id INT DEFAULT 0;
START TRANSACTION;
INSERT INTO `parent` (`name`) VALUES(parent_name);
SET parent_id = LAST_INSERT_ID();
INSERT INTO `child` (`name`) VALUES(child_name);
SET child_id = LAST_INSERT_ID();
INSERT INTO `map_parent_child` (`parent_id`,`child_id`) VALUES(parent_id,child_id);
commit;
END$$
DELIMITER ;
CALL sp_parent("test", "test", @parentid);
但是,当我尝试使用select获取输出变量时,我得到NULL,但是所有INSERT语句都可以正常工作,并将记录添加到数据库表中
SELECT @parentid;
我在这里缺少什么?设置变量的语法不正确,请使用
:
类似
SET parent_id := LAST_INSERT_ID();
SET child_id := LAST_INSERT_ID();
或者您也可以按以下步骤进行设置:
select LAST_INSERT_ID() into parent_id;
设置变量的语法不正确,请使用
:
等
SET parent_id := LAST_INSERT_ID();
SET child_id := LAST_INSERT_ID();
或者您也可以按以下步骤进行设置:
select LAST_INSERT_ID() into parent_id;
现在您可能已经解决了这个问题,但我注意到的关于存储过程的第一件事是,您有一个与输出变量同名的局部变量(
parent\u id
)。在我看来,您设置的是局部变量的值,而不是返回变量,因此调用者永远看不到正确的值
也许删除本地
父\u id
变量声明可以解决您的问题。您现在可能已经解决了这个问题,但我注意到您的存储过程的第一件事是您有一个与输出变量同名的本地变量(父\u id
)。在我看来,您设置的是局部变量的值,而不是返回变量,因此调用者永远看不到正确的值
也许删除本地
parent\u id
变量声明可以解决您的问题。您可以使用任何一种方法。。。!这不是问题Sashi:如果我使用SELECT LAST\u INSERT\u ID()插入父\u ID;那么OUT变量就没有用处了,因为您只需获得预期的输出,而不必使用“OUT”。但是我想使用SET并将自动递增的值返回给OUT变量,这样,如果任何其他用户看到我的存储过程,都可以轻松理解它返回的内容。。。。有意义吗?我已经在问题本身中添加了表格结构。你可以使用任何一种方式。。。!这不是问题Sashi:如果我使用SELECT LAST\u INSERT\u ID()插入父\u ID;那么OUT变量就没有用处了,因为您只需获得预期的输出,而不必使用“OUT”。但是我想使用SET并将自动递增的值返回给OUT变量,这样,如果任何其他用户看到我的存储过程,都可以轻松理解它返回的内容。。。。有意义吗?我已经在问题本身中添加了表结构。您能提供您的父表结构吗?由于字数限制,我无法为这些表的结构粘贴sql查询为什么我要问的是。。?为了**插入查询**成功,该父表不能有任何其他非空字段。只需检查插入查询是否成功插入即可。如果是这样,最后一条_记录将存储该值。记住另一件事,它不会存储显式插入的值这里只有两个字段(id和name)对于id自动递增的父表和子表。我已在问题本身中添加了表结构。能否提供父表结构由于字数限制,我无法为这些表的结构粘贴sql查询我问的原因是。。?为了**插入查询**成功,该父表不能有任何其他非空字段。只需检查插入查询是否成功插入即可。如果是这样,最后一条_记录将存储该值。请记住另一件事,它不会存储显式插入的值。对于id自动递增的父表和子表,只有两个字段(id和名称)。我在问题本身中添加了表结构。我遇到了这个问题。我遇到了这个问题