MySql触发器,声明变量不起作用

时间:2018-04-07 08:10:31

标签: mysql triggers

我收到错误" MySQL说:#1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在#DEC; DECLARE @itm_qty decimal(10,2)附近使用正确的语法; DECLARE @insert_qty十进制(10,2); SELECT @ ins'在第1行"。请帮助我

CREATE TRIGGER `updatestockqty` AFTER INSERT ON `billingitemtb` 
FOR EACH ROW 
AS
DECLARE @itm_qty as decimal(10,2); 
DECLARE @insert_qty as decimal(10,2);

SELECT @insert_id=i.bt_itmid from INSERTED i;

select @itm_qty=itemtb.itm_qtyinstock 
from itemtb 
where itemtb.itm_id=@insert_id;

BEGIN 
IF(i.bt_itmqty<@itm_qty)THEN 
UPDATE [db].itemtb
SET itemtb.itm_qtyinstock = itemtb.itm_qtyinstock - NEW.bt_itmqty 
WHERE itemtb.itm_id = NEW.bt_itmid; 
end IF;
END

2 个答案:

答案 0 :(得分:0)

至于Starter,DECALRE应该在BEGIN和END

CREATE TRIGGER `updatestockqty` AFTER INSERT ON `billingitemtb` 
FOR EACH ROW 
AS
BEGIN 
DECLARE @itm_qty decimal(10,2); 
DECLARE @insert_qty decimal(10,2);
SET @itm_qty  = select itemtb.itm_qtyinstock 
from itemtb 
where itemtb.itm_id=NEW.bt_itmid -- Change this itemID column to corresponding column in billingitem;
IF(i.bt_itmqty<@itm_qty)THEN 
UPDATE itemtb
SET itemtb.itm_qtyinstock = itemtb.itm_qtyinstock - NEW.bt_itmqty 
WHERE itemtb.itm_id = NEW.bt_itmid; 
end IF;
END

来自文档https://dev.mysql.com/doc/refman/5.7/en/declare.html

  

仅允许在BEGIN ... END复合语句中使用DECLARE   并且必须在任何其他陈述之前开始。

答案 1 :(得分:0)

我得到了答案

BEGIN 
DECLARE itm_qty decimal; 
DECLARE insert_qty decimal;
declare msg varchar(128);
 select itemtb.itm_qtyinstock INTO itm_qty
  from itemtb 
  where itemtb.itm_id=NEW.bt_itmid;
if new.bt_itmqty < itm_qty THEN 
 UPDATE itemtb
 SET itemtb.itm_qtyinstock = itemtb.itm_qtyinstock - NEW.bt_itmqty 
 WHERE itemtb.itm_id = NEW.bt_itmid; 
ELSE
 set msg = concat('MyTriggerError: Trying to insert a greater qty value in 
           updatestockqty: ');
         signal sqlstate '45000' set message_text = msg;
end IF;
END