【问题标题】:Mysql - Stored procedure OUT variable return nullMysql - 存储过程 OUT 变量返回 null
【发布时间】:2012-11-29 19:20:08
【问题描述】:

我的表结构是:

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;

我在这里缺少什么?

【问题讨论】:

  • 你能提供你的表结构
  • 由于字数限制,我无法为这些表的结构粘贴 sql 查询
  • 为什么我要问的是..?该父表不能有任何其他字段不为空,以便**插入查询**成功。只需检查插入查询是否成功插入。如果是这样,last_record 将存储该值。请记住另一件事,它不会存储明确插入的值
  • 父子表只有两个字段(id和name),其中id是自动递增的。
  • 我已经在问题本身中添加了表格结构。

标签: mysql variables stored-procedures null out


【解决方案1】:

设置变量的语法错误,使用:like,

SET parent_id := LAST_INSERT_ID();
 SET child_id := LAST_INSERT_ID();

或者你可以设置为

select LAST_INSERT_ID() into parent_id;

【讨论】:

  • 你可以使用任何一种方式......!这不是问题
  • Sashi:如果我使用 SELECT LAST_INSERT_ID() 进入 parent_id;那么就没有使用 OUT 变量,因为您将简单地获得预期的输出而不使用“OUT”。但我想使用 SET 并将自动递增的值返回给 OUT 变量,这样如果任何其他用户看到我的存储过程,就可以很容易地理解它返回的内容......有意义吗?
  • 我在问题本身中添加了表格结构。
【解决方案2】:

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

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

【讨论】:

  • 我遇到了这个确切的问题
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多