2012-12-12 45 views
0

我的表结构是:MySQL的 - 存储过程OUT变量返回NULL

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); 

一个存储过程,但当我尝试使用选择的话,我去获取输出变量但是,所有INSERT语句都正常工作,并将记录添加到数据库表中。

SELECT @parentid; 

我在这里失踪了什么?

+0

你可以提供你的** **父表结构 – Chella

+0

由于字数限制,为什么我问的是我不能粘贴SQL查询这些表 – neeraj

+0

的结构..?该父表不能有任何其他字段为非空,以便**插入查询**成功。只要检查插入查询是否被成功插入。如果是这样,last_record将存储该值。另外还有一点,它不会存储明确插入的值。 – Chella

回答

4

您现在可能已经解决了这一点,但第一我注意到关于存储过程的事情是,你有一个局部变量,其名称与输出变量相同(parent_id)。它在我看来你是设置本地变量的值而不是返回变量,所以调用者从不会看到正确的值。

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

+0

这个答案帮了我。谢谢 – Prem

+0

我有这个确切的问题 –

1

的语法来设置变量是不正确,使用:一样,

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

或者你可以设置为

select LAST_INSERT_ID() into parent_id; 
+0

我已经试过,但仍然不是运气。 – neeraj

+0

你可以用任何一种方式...!它不是一个问题 – Chella

+0

Sashi:如果我使用SELECT LAST_INSERT_ID()到parent_id;那么没有使用OUT变量,因为您只需在不使用“OUT”的情况下获得预期的输出。但我想使用SET并将自动递增的值返回给OUT变量,以便如果有其​​他用户看到我的存储过程,可以很容易地理解它返回的内容....有意义吗? – neeraj