【问题标题】:MySql trigger with declaration variable not working带有声明变量的MySql触发器不起作用
【发布时间】:2018-04-07 08:10:30
【问题描述】:

我收到错误“MySQL 说:#1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'DECLARE @itm_qty decimal(10,2) 附近使用的正确语法; DECLARE @insert_qty decimal(10,2); SELECT @ins' at line 1".please help me

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

【问题讨论】:

  • 请格式化您的代码

标签: mysql triggers


【解决方案1】:

至于 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

DECLARE 只允许在 BEGIN ... END 复合语句中 并且必须在它的开头,在任何其他语句之前。

【讨论】:

  • 我仍然收到错误“错误代码:1064。您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'AS BEGIN DECLARE @ 附近使用的正确语法itm_qty as decimal(10,2)' 在第 3 行 0.000 秒'
【解决方案2】:

我得到了答案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多