2012-12-12 46 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