2012-11-21 60 views
0

在這種觸發:在觸發器使用局部變量

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 

我得到這個錯誤

架構創建失敗:您有一個錯誤的SQL語法;檢查 對應於您的MySQL服務器版本的手冊 的語法要在'DECLARE VAR_NEW_VERSION INT; SET VAR_NEW_VERSION = VAR_P_VERSION + 1; 「在第23行:

如果我刪除

DECLARE VAR_NEW_VERSION INT; 
SET VAR_NEW_VERSION = VAR_P_VERSION + 1 

或更改本地變量session變量(與前面加上@),那麼代碼好吧運行。


Q.爲什麼會發生這種情況?

回答

1

問題出在語法上。這是不正確的。

所有聲明必須在BEGIND ... END子句的開頭。您可以在代碼中隨意設置用戶變量。

+0

非常感謝 – Tivie

1

所有的DECLARE應該在觸發器的開始。

這不是一種C++語言,您可以混合使用聲明和語句,但更像C語言,其中所有聲明都必須在所有語句之前完成。