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 構文にエラーがあります。'DECLARE VAR_NEW_VERSION INT;' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。SET VAR_NEW_VERSION = VAR_P_VERSION + 1; ' 23 行目:

外すと

DECLARE VAR_NEW_VERSION INT; 
SET VAR_NEW_VERSION = VAR_P_VERSION + 1

または、ローカル変数をセッション変数に変更 (@ を先頭に追加) すると、コードは正常に実行されます。


Q. これはなぜですか?

4

2 に答える 2

2

すべての DECLARE は、トリガーの先頭にある必要があります。

これは、宣言とステートメントを混在させることができる C++ のような言語ではありませんが、すべてのステートメントの前にすべての宣言を行う必要がある C に似ています。

于 2012-11-21T15:37:32.003 に答える
2

問題は構文にあります。正しくありません。

すべての宣言は、BEGIND...END 句の先頭にある必要があります。コード内の任意の場所に設定できるユーザー変数。

于 2012-11-21T15:37:49.713 に答える