mysql - 在触发器中使用局部变量

标签 mysql sql

在此触发器中:

  CREATE TRIGGER `after_insert_normas_revision`
    AFTER INSERT ON `normas_revision` FOR EACH ROW
    BEGIN

      DECLARE VAR_P_RHID INT;
      DECLARE VAR_P_VERSION INT;

      SELECT MAX(a.`rhID`)
      INTO VAR_P_RHID
        FROM `revision_history` a
        WHERE a.nID = new.`nID`;


      IF VAR_P_RHID IS NULL THEN
        SET VAR_P_VERSION = 0;
      ELSE
        SELECT `version`
          INTO VAR_P_VERSION
          FROM `revision_history` a
          WHERE a.`rhID` = VAR_P_RHID;
      END IF;

      DECLARE VAR_NEW_VERSION INT;
      SET VAR_NEW_VERSION = VAR_P_VERSION + 1;


      INSERT INTO `revision_history`
        (`revID`, `nID`, `userID`, `timestamp`, 
         `prev_rhID`, `version`, `action`, `comment`)
      VALUES
        (new.`revID`, new.`nID`, new.`userID`, CURRENT_TIMESTAMP, VAR_P_RHID, VAR_NEW_VERSION, 'UPDATE', new.`_rev_comment`);

    END

我收到此错误

Schema Creation Failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE VAR_NEW_VERSION INT; SET VAR_NEW_VERSION = VAR_P_VERSION + 1; ' at line 23:

如果我删除

DECLARE VAR_NEW_VERSION INT; 
SET VAR_NEW_VERSION = VAR_P_VERSION + 1

或者将局部变量更改为 session 变量(前面加上@),然后代码就可以正常运行了。

<小时/>

问。为什么会出现这种情况?

最佳答案

问题出在语法上。这是不正确的。

所有声明必须位于 BEGIND...END 子句的开头。您可以在代码中的任意位置设置用户变量。

关于mysql - 在触发器中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13496579/

相关文章:

php - 更新 opencart 数据库中的 php 选择值

mysql - Contao CMS 查询 'checkboxWizard' BLOB 字段

java - 有效地为来自 2 个不同服务器的 N 个值选择 Top/Max/Avg(任何聚合函数)

mysql - 加入不同的表并用mysql在一行上显示匹配记录

java - 通过 CallableStatement 调用存储过程时出现 "Parameter is not an OUT parameter"错误

mysql - MySQL 中的分层数据

mysql - SQL 从名称包含查询的多个表中选择

php - SQL 查询无效/不显示结果

mysql - Mariadb - 从用户 ID = 变量的所有消息列表中获取最新消息

sql - Linux SQL 服务器 Windows SSMS 连接