我知道这是一个问题,但我尝试了几项修正案,但没有解决办法。
我的触发器:
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请帮帮忙。
1条答案
按热度按时间wi3ka0sx1#
请注意,
roomtype
和@roomtype
是两个不同的变量。你用local variable DECLARE statement声明的变量在一个存储例程的主体内有一个作用域,它们从来不用
@
符号拼写。带有
@
符号的user-defined variables具有MySQL会话的作用域,您不需要声明这类变量,只需将变量设置为一个值即可隐式创建该变量。你不能
SET roomtype = ...
并期望从@roomtype
变量中读取该字符串,反之亦然。您似乎声明了局部变量,因此应一致地使用它们。但在某些情况下,变量名与列名相同,如果在同时引用具有这些列的表的SQL语句中使用变量,则会导致不明确。因此,应采用命名约定以保持它们的区别。
(This代码没有经过测试,所以如果有任何错误请道歉。它只是为了演示如何一致地使用非sigil变量。)