2013-04-05 57 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工作臺給我一個錯誤的DECLARE m_projects_id。我不太明白,因爲我的指令同上面兩行......

任何提示?

編輯:neubert解決了這個錯誤。謝謝。

不過不失,當我嘗試插入到用戶:

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

你有什麼想法?或者更好的,你知道我怎麼能得到一個更好的錯誤信息?

+1

看看這裏:http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zero-rows-fetched-selected-or-processed – 2013-04-22 06:05:24

回答

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 2013-04-05 19:32:27

+1

嘗試用'SET @m_user_team_id:='替換'SELECT @ m_user_team_id'。我更新了我的帖子。 – neubert 2013-04-05 20:08:26

+0

只是一個註釋:「BEGIN DECLARE m_user_team_id integer;」 - >記住在代碼上使用DECLARE – 2014-07-02 15:27:00

1

同意neubert關於DECLARE語句,這將解決語法錯誤。但我建議你避免使用openning遊標,它們可能會很慢。

對於您的任務:使用INSERT ... SELECT語句,它將幫助您僅使用一個查詢將數據從一個表複製到另一個表。

INSERT ... SELECT Syntax