如何在触发器中设置和使用变量?

时间:2019-07-31 12:14:54

标签: mysql sql

我正在MySQL中创建一个触发器,该触发器应设置一个变量并使用它来更新表。但是我找不到合适的语法来实现这项工作。

这是我尝试过的:

CREATE TRIGGER after_assinatura_update AFTER UPDATE
ON documento_eletronico_assinatura
FOR EACH ROW
BEGIN
    SET @prox_ass = (
        SELECT dea.usuario_id
        FROM documento_eletronico_assinatura dea
        INNER JOIN usuario u ON dea.usuario_id = u.id
        WHERE dea.documento_id = NEW.documento_id
        AND dea.assinatura = 0
        ORDER BY dea.posicao ASC
        LIMIT 1
    );/*ERROR: statement incomplete, expecting: ';'*/

    UPDATE documento_eletronico 
    SET documento_eletronico.prox_assinatura = @prox_ass
    WHERE documento_eletronico.id = NEW.documento_id;
CREATE TRIGGER after_assinatura_update AFTER UPDATE
ON documento_eletronico_assinatura
FOR EACH ROW
    UPDATE documento_eletronico 
    SET documento_eletronico.prox_assinatura = @prox_ass
    WHERE documento_eletronico.id = NEW.documento_id;
/*TRIGGER stops here and doesn't set the variable. Adding a BEGIN gives the "expected: ';'" at The line above.*/
    SET @prox_ass = (
        SELECT dea.usuario_id
        FROM documento_eletronico_assinatura dea
        INNER JOIN usuario u ON dea.usuario_id = u.id
        WHERE dea.documento_id = NEW.documento_id
        AND dea.assinatura = 0
        ORDER BY dea.posicao ASC
        LIMIT 1
    );

1 个答案:

答案 0 :(得分:1)

您可能只需要一个DELIMITER语句。但是,您可以将其表示为一个语句:

SET @prox_ass = (
    /*ERROR: statement incomplete, expecting: ';'*/

UPDATE documento_eletronico de CROSS JOIN
       (SELECT dea.usuario_id
        FROM documento_eletronico_assinatura dea JOIN
             usuario u
             ON dea.usuario_id = u.id
        WHERE dea.documento_id = NEW.documento_id AND
              dea.assinatura = 0
        ORDER BY dea.posicao ASC
        LIMIT 1
       ) u
);
SET de.prox_assinatura = u.usuario_id
WHERE de.id = NEW.documento_id;