我有以下存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS spCashDonation$$
CREATE PROCEDURE spCashDonation(IN fname varchar(50),IN lname varchar(50),IN telNo bigint, IN pmode tinyint,IN amt decimal(8,2), OUT rno varchar(20))
BEGIN
Set @rmain := (select trim(concat('DNB', DATE_FORMAT(CURRENT_DATE(), '%y'), DATE_FORMAT(CURRENT_DATE(), '%m'))));
IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 1)) THEN
Set @rpart = 1;
END IF;
IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 1)) THEN
Set @rpart := (select coalesce(max(ReceiptPart),0) from Donation) + 1;
END IF;
INSERT INTO Donation (ReceiptMain, ReceiptPart, firstName, lastName, telNo, payMode, Amount) VALUES (@rmain, @rpart, fname, lname, telNo, pmode, amt);
Set @lid := (select LAST_INSERT_ID()from donation);
select concat(ReceiptMain,ReceiptPart) into rno from donation where id = @lid;
END$$
DELIMITER ;
Call spCashDonation ('RAJIV','IYER',7506033048,0,1000,@rno);
select @rno;
当表没有记录时,第一次插入会很好。在第二个插入时,它会抛出错误
错误代码:1242。子查询返回的行数超过1行
当我查询最后一个插入ID时,我得到的值超过1。所以,我将程序的最后一部分修改为:
设置@lid:=(从捐赠中选择max(LAST_INSERT_ID());
请提供建议,如果这样可以,因为它不应该妨碍任何并发插入和未来的CRUD操作。提前谢谢。
答案 0 :(得分:0)
Set @lid := (select LAST_INSERT_ID() from donation);
在上面的行中删除FROM
语句。如果捐赠表中有多条记录,则返回LAST_INSERT_ID()值的相同次数。
因此,只需使用Set @lid := (SELECT LAST_INSERT_ID());
它就可以适用于您的情况。