MySql存储过程返回值错误

时间:2016-06-30 07:13:31

标签: mysql stored-procedures

我使用以下存储过程:

DELIMITER $$ 
USE `customer`$$ 
DROP PROCEDURE IF EXISTS `InsertCustomerEmail`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertCustomerEmail`(IN p_Customer_ID INT(11), 
                                  IN p_from_who VARCHAR(50), 
                                  IN p_to_whom VARCHAR(50), 
                                  IN p_CC VARCHAR(50), 
                                  IN p_BCC VARCHAR(50), 
                                  IN p_Subject VARCHAR(500), 
                                  IN p_Massage VARCHAR(4000), 
                                  IN p_Is_Sent BIT(1), 
                                  IN p_Sent_When DATE, 
                                  IN p_Is_Active BIT(1), 
                                  OUT new_ID INT) 
BEGIN 
    INSERT INTO customer_emails ( 
        `Customer_ID`, 
        `from_who`, 
        `to_whom`, 
        `CC`, 
        `BCC`, 
        `Subject`, 
        `Massage`, 
        `Is_Sent`, 
        `Sent_When`, 
        `Is_Active` 
        ) VALUES (p_Customer_ID, 
              p_from_who, 
              p_to_whom, 
              p_CC, 
              p_BCC, 
              p_Subject, 
              p_Massage, 
              p_Is_Sent, 
              p_Sent_When, 
              p_Is_Active); 
    SET @new_ID=SCOPE_IDENTITY(); 
END$$ 
DELIMITER ;

我的数据库有一个自动增量ID列,我想在ID变量中返回此New_ID(最后添加的一个),但是当我为该过程运行CALL时,它返回{{ 1}}代表NULL

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

@new_ID转让的原因不被视为交易的一部分; INSERT语句是。将以下行移到BEGIN ... END

之外
SET @new_ID=SCOPE_IDENTITY(); 

由于批次中只有一个操作,因此您可以松开BEGIN...END

修改

正如Thorsten Dittmar建议我需要进一步解释一下。 @new_ID赋值会立即执行,因为它不被视为DML操作且不属于批处理。因此SCOPE_IDENTITTY()被执行,但是还没有生成标识,因为INSERT语句被认为是批处理的一部分,并且它在结束时执行。

编辑2

由于OP添加了MySQL标记,因此上述语句不起作用,因为MySQL中没有SCOPE_IDENTITY()。相反,正确的函数是LAST_INSERT_ID()

SET @new_ID=LAST_INSERT_ID();