我使用以下存储过程:
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
。
有什么建议吗?
谢谢!
答案 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();