2013-04-05 12 views
10

MySQLに慣れていれば、私の質問は簡単かもしれません。私はPostgreSQL SGBDに慣れており、PL/PgSQLスクリプトをMySQLに翻訳しようとしています。変数MySQLトリガーを宣言する

delimiter // 

CREATE TRIGGER pgl_new_user 
AFTER INSERT ON users FOR EACH ROW 
BEGIN 
    DECLARE m_user_team_id integer; 
    SELECT id INTO m_user_team_id FROM user_teams WHERE name = "pgl_reporters"; 

    DECLARE m_projects_id integer; 
    DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id; 

    OPEN cur; 
     ins_loop: LOOP 
      FETCH cur INTO m_projects_id; 
      IF done THEN 
       LEAVE ins_loop; 
      END IF; 
      INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access) 
      VALUES (NEW.id, m_projects_id, now(), now(), 20); 
     END LOOP; 
    CLOSE cur; 
END// 

しかし、MySQLのWorkbenchは私にDECLARE m_projects_id上のエラーを与える:ここで

は私が持っているものです。私は上の2行で同じ指示をしているので、実際にはわかりません...

ヒント?

EDIT:neubertがこのエラーを解決しました。ありがとう。

しかし、私は、ユーザーに挿入しようとすると、まだ、:

Error Code: 1329. No data - zero rows fetched, selected, or processed 

あなたはどんな考えを持っていますか?それとも、より良いエラーメッセージを得ることができるかを知っていますか?

+1

ここをクリックしてください:http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zerorows-fetchched-selected-or-processed –

答えて

16

すべてのDECLAREが最上位にある必要があります。すなわち、

delimiter // 

CREATE TRIGGER pgl_new_user 
AFTER INSERT ON users FOR EACH ROW 
BEGIN 
    DECLARE m_user_team_id integer; 
    DECLARE m_projects_id integer; 
    DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id; 

    SET @m_user_team_id := (SELECT id FROM user_teams WHERE name = "pgl_reporters"); 

    OPEN cur; 
     ins_loop: LOOP 
      FETCH cur INTO m_projects_id; 
      IF done THEN 
       LEAVE ins_loop; 
      END IF; 
      INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access) 
      VALUES (NEW.id, m_projects_id, now(), now(), 20); 
     END LOOP; 
    CLOSE cur; 
END// 
+0

右!これは実際に私の問題を解決しています(pgsqlでは、 'BEGIN'の前に' DECLARE'することはできません。ほとんど同じです)。私はこのスクリプトに別のエラーがありました: 'エラーコード:1415.トリガから結果セットを返すことはできません '。私は最初の 'SELECT'を置き換えて解決しました。しかしそれでも、それはまだ動作しません。あなたが私を助けたいなら、私は私の投稿を編集しました。 – Arthur

+1

'SELECT @ m_user_team_id'を' SET @m_user_team_id:= 'に置き換えてみてください。私は自分の投稿を更新しました。 – neubert

+0

メモ: "BEGIN DECLARE m_user_team_id integer;" - >コードの上でDECLAREを使うことを忘れないでください –

1

DECLARE文についてneubertと合意すると、構文エラーが修正されます。しかし、私はあなたがオープンカーソルを使用することを避けることをお勧めします、彼らは遅くなる可能性があります。

目的:1つのクエリのみを使用してあるテーブルから別のテーブルにデータをコピーするのに役立つINSERT ... SELECTステートメントを使用します。

INSERT ... SELECT Syntax