2016-05-18 9 views
1

複数の行を返す私は、以下のストアドプロシージャを持っている:表が記録されていない場合はLAST INSERT ID SQLサブクエリが

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; 

、最初のインサートは罰金を通過します。 2番目の挿入時にそれが

エラーコードなどのエラーがスローされます:1242サブクエリは、私が最後に挿入IDを照会するとき、私は1つの以上の値を取得超える1行

に戻ります。そこで、手順の最後の部分を次のように変更しました。

@lid:=(寄付からmax(LAST_INSERT_ID()を選択);

同時挿入と今後のCRUD操作を妨げてはいけないので、これが問題なければ助言してください。前もって感謝します。

答えて

0
Set @lid := (select LAST_INSERT_ID() from donation); 

上記の行には、FROM文が削除されています。寄付テーブルに複数のレコードがある場合は、同じ回数だけLAST_INSERT_ID()の値を返します。

Set @lid := (SELECT LAST_INSERT_ID());を使用すると、あなたのケースではうまくいきます。

+0

ありがとう、それは – Rajiv

+0

うれしい、それはあなたの問題を解決:) – Arulkumar