Mysql - 存储过程OUT变量返回null

标签 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 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;

我在这里缺少什么?

最佳答案

您现在可能已经解决了这个问题,但关于您的存储过程,我注意到的第一件事是您有一个与输出变量 (parent_id) 同名的局部变量。在我看来,您正在设置局部变量的值而不是返回变量,因此调用者永远不会看到正确的值。

也许删除本地 parent_id 变量声明将解决您的问题。

关于Mysql - 存储过程OUT变量返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833804/

相关文章:

java - Oracle glassfish4.1 jms数据库存储

php - 表更新时 jQuery 更新 div

mysql - 获取结果列表并在一个查询中获取总数

Java 常量变量,命名约定

java - 如何在java中声明一个数值变量,该变量始终保存固定长度为3位的数字值。

mysql - 在mysql中保存页面浏览量

javascript - 如何让用户输入变量名?

PHP - 循环中的bindValue调用要插入的存储过程,仅在第一次调用时有效

mysql - 始终从表中选择 x 行,并在最后重新开始

mysql - 存储过程 - 需要使用 SELECT 语句的结果