不允许在MySQL触发器中返回结果集。请仅返回翻译后的文本内容。

16
delimiter $$
CREATE TRIGGER REDUCE_NOTE_COUNT
 AFTER DELETE ON iv_notes
 FOR EACH ROW  BEGIN
DECLARE supplierid int(11);
DECLARE customerid int(11);

SELECT supplierid ,customerid FROM iv_documents WHERE id=OLD.note_documentid;
SET supplierid=supplierid;
SET customerid=customerid;

IF supplierid=OLD.note_companyid THEN
    update iv_documents 
            set supplier_notes=supplier_notes-1 
            where id=OLD.note_documentid and supplier_notes>0;
END IF;
IF customerid=OLD.note_companyid THEN
    update iv_documents set customer_notes=customer_notes-1 
            where id=OLD.note_documentid 
            and customer_notes>0 ;
END IF;
END$$

delimiter ;

3
新用户提示:请大家提问时明确问题,不要让人猜测你的需求。请注明你使用的版本以及可能出现的错误信息 :) - Piotr Wadas
2个回答

40

无法在触发器中执行SELECT语句。如果您想设置变量,请使用SELECT INTO语句,例如 -

DECLARE supplierid_ INT(11);
DECLARE customerid_ INT(11);

SELECT
  supplierid, customerid
INTO
  supplierid_, customerid_
FROM
  iv_documents
WHERE
  id = OLD.note_documentid;

IF supplierid_ = OLD.note_companyid THEN
...

另外,重命名变量,它们必须与字段名称不同。


1
如果答案可以的话,请接受它。 - Devart
我的问题也是在每个SELECT语句之前都有DECLARE。显然,根据MySQL的智慧,DECLARE必须放在顶部,不能在触发器中间声明变量,这似乎有某种神奇的原因。 - Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy 在过程块中首先要有DECLARE语句的要求并不是神奇的,详见https://dev.mysql.com/doc/refman/8.0/en/declare.html ""DECLARE只允许在BEGIN ... END复合语句内,并且必须在其开始之前,位于任何其他语句之前。声明必须按照一定的顺序进行。游标声明必须出现在处理程序声明之前。变量和条件声明必须出现在游标或处理程序声明之前。"" - undefined

0
触发器函数中,允许使用SELECT INTO,但不允许使用没有INTOSELECT,因为会出现以下错误。*在过程事件中,允许使用没有INTOSELECT

错误 1415 (0A000):不允许从触发器返回结果集

错误 1415 (0A000):不允许从函数返回结果集


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接