mysql sql触发器无法从select设置变量

hkmswyz6  于 2023-02-15  发布在  Mysql
关注(0)|答案(1)|浏览(182)

我知道这是一个问题,但我尝试了几项修正案,但没有解决办法。
我的触发器:

BEGIN
DECLARE bookid INT;
DECLARE roomtype varchar(20);
DECLARE amount INT;
DECLARE m_count INT;
DECLARE curr_m varchar(20);
SET @bookid := NEW.id;
SET roomtype := (SELECT title FROM pm_booking_room WHERE id_booking=@bookid);
SET amount := (SELECT amount from pm_booking_payment WHERE id_booking=@bookid);
SET @curr_m:= (MONTHNAME(NOW()));
SET @m_count:= (SELECT count(*) FROM pm_report WHERE month=@curr_m);
INSERT INTO `pm_report`(`month`, `room_type`, `amount`) VALUES(@curr_m,@roomtype,@amount); 
END

当我检查表时,它插入,但只有@Curr是月份名。其余的它插入NULL我尝试了SET @roomtype SELECT title FROM pm_booking_room WHERE id_booking=@bookid,但仍然是NULL。也尝试了SET @roomtype := (SELECT title FROM pm_booking_room WHERE id_booking=@bookid);,但仍然是NULL。
我正在使用PhpMyadmin创建:
x1c 0d1x请帮帮忙。

wi3ka0sx

wi3ka0sx1#

请注意,roomtype@roomtype是两个不同的变量。
你用local variable DECLARE statement声明的变量在一个存储例程的主体内有一个作用域,它们从来不用@符号拼写。
带有@符号的user-defined variables具有MySQL会话的作用域,您不需要声明这类变量,只需将变量设置为一个值即可隐式创建该变量。
你不能SET roomtype = ...并期望从@roomtype变量中读取该字符串,反之亦然。
您似乎声明了局部变量,因此应一致地使用它们。但在某些情况下,变量名与列名相同,如果在同时引用具有这些列的表的SQL语句中使用变量,则会导致不明确。因此,应采用命名约定以保持它们的区别。

BEGIN
DECLARE v_bookid INT;
DECLARE v_roomtype varchar(20);
DECLARE v_amount INT;
DECLARE v_count INT;
DECLARE v_month varchar(20);
SET v_bookid := NEW.id;
SET v_roomtype := (SELECT title FROM pm_booking_room WHERE id_booking=v_bookid);
SET v_amount := (SELECT amount from pm_booking_payment WHERE id_booking=v_bookid);
SET v_month:= (MONTHNAME(NOW()));
SET v_count:= (SELECT count(*) FROM pm_report WHERE month=v_month);
INSERT INTO `pm_report`(`month`, `room_type`, `amount`) VALUES(v_month,v_roomtype,v_amount); 
END

(This代码没有经过测试,所以如果有任何错误请道歉。它只是为了演示如何一致地使用非sigil变量。)

相关问题