2014-03-24 31 views
0

我試圖創建一個觸發器,但它顯示「不允許顯式和隱式命令」。我試圖在這裏提及其他主題,但我不清楚。我的觸發器代碼。Mysql觸發器顯式隱式命令不允許

USE `vms`; 
DELIMITER $$ 
CREATE TRIGGER `trg_bookingdetails` AFTER INSERT ON `bookingdetails` FOR EACH ROW 
BEGIN 
declare i int default 1; 
DECLARE v_ga INT DEFAULT 0; 
declare v_bid varchar(20); 
declare v_bdate date; 
declare v_sdate date; 
declare v_sid varchar(20); 
declare v_bcode varchar(10); 
declare v_q int; 
declare v_vid int; 
declare v_jj int; 
declare v_ss int; 
declare v_mj int; 
create temporary table if not exists temp_boo 
(
    `BID` VARCHAR(50) NULL DEFAULT NULL, 
    `BDate` DATE NULL DEFAULT NULL, 
    `SDate` DATE NULL DEFAULT NULL, 
    `SID` VARCHAR(20) NULL DEFAULT NULL, 
    `BCode` VARCHAR(20) NULL DEFAULT NULL, 
    `VID` VARCHAR(20) NULL DEFAULT NULL 
); 
begin 
select bm.BID,bm.BDate,bm.SDate,bm.SID,bd.BCode, bd.Quantity 
into v_bid,v_bdate,v_sdate,v_sid,v_bcode,v_ga 
from bookingmaster bm, bookingdetails bd 
where bm.sdate=new.SDate and bm.BID=bd.BID and bd.BCode='GAP' 
and bm.BID=new.BID; 
end; 
WHILE (i<=v_ga) DO 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
     VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
set i=1; 
begin 
select bm.BID,bm.BDate,bm.SDate,bm.SID,bd.BCode, bd.Quantity 
into v_bid,v_bdate,v_sdate,v_sid,v_bcode,v_jj 
from bookingmaster bm, bookingdetails bd 
where bm.sdate=new.SDate and bm.BID=bd.BID and bd.BCode='JJP' 
and bm.BID=new.BID; 
end; 
WHILE (i<=v_jj) DO 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
     VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
set i=1; 
begin 
select bm.BID,bm.BDate,bm.SDate,bm.SID,bd.BCode, bd.Quantity 
into v_bid,v_bdate,v_sdate,v_sid,v_bcode,v_ss 
from bookingmaster bm, bookingdetails bd 
where bm.sdate=new.SDate and bm.BID=bd.BID and bd.BCode='SSP' 
and bm.BID=new.BID; 
end; 
WHILE (i<=v_ss) DO 
START transaction; 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
     VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
set i=1; 
begin 
select bm.BID,bm.BDate,bm.SDate,bm.SID,bd.BCode, bd.Quantity 
into v_bid,v_bdate,v_sdate,v_sid,v_bcode,v_mj 
from bookingmaster bm, bookingdetails bd 
where bm.sdate=new.SDate and bm.BID=bd.BID and bd.BCode='MJP' 
and bm.BID=new.BID; 
end; 
WHILE (i<=v_mj) DO 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
     VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
Insert into bookinguser (BID,BDate,SDate,SID,BCode) 
(select BID,BDate,SDate,SID,BCode from temp_boo 
where (BID,BDate,SDate,SID,BCode) 
not in (select BID,BDate,SDate,SID,BCode from bookinguser)); 
drop table temp_boo; 
end 

請讓我知道我在哪裏做錯誤。

+0

[19.3.1觸發語法和實施例](http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html): 「觸發器不能使用顯式或隱式地開始或結束事務的語句,例如START TRANSACTION,COMMIT或ROLLBACK。」 – wchiquito

+0

我可以對我的代碼做些什麼改變...... – Sachin

回答

0

試試這個:

... 
WHILE (i<=v_ss) DO 
/*START transaction;*/ 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
     VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
... 

UPDATE

不能使用觸發器內DROP TABLE。見13.3.3 Statements That Cause an Implicit Commit

... 
Insert into bookinguser (BID,BDate,SDate,SID,BCode) 
(select BID,BDate,SDate,SID,BCode from temp_boo 
where (BID,BDate,SDate,SID,BCode) 
not in (select BID,BDate,SDate,SID,BCode from bookinguser)); 
/*drop table temp_boo;*/ 
... 

SQL Fiddle demo

更新1

更好的方法是:

13.3.3 Statements That Cause an Implicit Commit

「CREATE TABLE和DROP TA如果 使用TEMPORARY關鍵字,則BLE語句不會提交事務。「。

... 
WHILE (i<=v_ss) DO 
/*START transaction;*/ 
Insert into temp_boo(BID,BDate,SDate,SID,BCode) 
    VALUES(new.BID,new.BDate,new.SDate,new.SID,new.BCode); 
SET i=i+1; 
END WHILE; 
... 
Insert into bookinguser (BID,BDate,SDate,SID,BCode) 
(select BID,BDate,SDate,SID,BCode from temp_boo 
where (BID,BDate,SDate,SID,BCode) 
not in (select BID,BDate,SDate,SID,BCode from bookinguser)); 
drop temporary table temp_boo; 
... 

SQL Fiddle demo

+0

嗨wchiquito。 我已經刪除了START TRANSACTION部分,仍然是相同的。 :-( – Sachin

+0

@Sachin:查看更新後的答案 – wchiquito

+0

這個問題似乎已經解決了,現在我得到的另一個是...錯誤1336:在存儲函數或觸發器中不允許動態SQL – Sachin