3

我在创建触发器时遇到了一点问题,因为我必须声明一些变量,然后将其中一些变量设置为 0,因此它们将根据条件开始在循环中增加它们的值。无论如何,我要粘贴代码,以及它抛出的错误,希望有人能告诉我我做错了什么。谢谢。

CREATE TRIGGER update_request AFTER UPDATE ON medical_tests
FOR EACH ROW
BEGIN
DECLARE y INT, x0 INT, x3 INT, counting INT
SET y=0, x0=0, x3=0,
counting = count(SELECT * FROM medical_tests WHERE medical_tests.request_id = UPDATED.request_id)

WHILE (y<counting)
BEGIN
SET y=y+1
IF (medical_tests.status=1)
BEGIN
SET x0=x0+1
END
ELSEIF (medical_tests.status=3)
BEGIN
SET x3=x3+1
END
END IF
END WHILE

IF (x0>0 AND x0<counting)
BEGIN
UPDATE requests SET status=2 WHERE requests.id=UPDATED.request_id
END
ELSEIF (x3=counting)
BEGIN
UPDATE requests SET status=3 WHERE requests.id=UPDATED.request_id
END
ENDIF
END

它会引发以下错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 ' x0 INT, x3 INT,counting INT SET y=0, x0=0, x3=0,counting=count(SELECT * FROM m' at line 3.

上次我写了一个触发器,我是在 MySQL 服务器上做的,语法有点不同。也许我只需要创建一个过程并调用它。因此,如果有人可以提供帮助,我将不胜感激。

4

1 回答 1

2

第一件事。MySQL变更中正确声明相同类型和相同初始值的变量

DECLARE y INT, x0 INT, x3 INT, counting INT

DECLARE y, x0, x3, counting INT DEFAULT 0;

这声明了四个类型INT的变量,默认值为0.

但这仅仅是开始。您的代码还有其他几个问题:

  1. 您必须用分号终止每个;语句,包括IF ... END IF;WHILE ... END WHILE;
  2. 要引用要更新的行的列,您必须使用NEW关键字而不是UPDATED.
  3. 您不需要将每个SET语句包装在BEGIN...END块中。它只会增加混乱。
  4. 您不能随意访问 while 循环中的列值(medical_tests.status=1)。如果您打算引用status正在更新的行的列,那么您需要再次使用特殊关键字NEWOLD. 如果您打算遍历其他一些结果集,那么您应该使用游标或在SELECT语句中执行。
于 2013-11-10T05:19:37.623 回答