2013-04-05 11 views
10

Moje pytanie może być proste, jeśli jesteś przyzwyczajony do MySQL. Jestem przyzwyczajony do PostgreSQL SGBD i próbuję przetłumaczyć skrypt PL/PgSQL na MySQL.Zdeklaruj zmienną wyzwalacz MySQL

Oto co mam:

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// 

Ale MySQL Workbench daje mi błąd na DECLARE m_projects_id. Naprawdę nie rozumiem, ponieważ mam tę samą instrukcję dwie linie powyżej ...

Jakieś wskazówki?

EDYCJA: neubert rozwiązany ten błąd. Dzięki.

Ale jeszcze, gdy próbuję wstawić do użytkowników:

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

Czy masz jakiś pomysł? Lub lepiej, czy wiesz, w jaki sposób mogę uzyskać lepszy komunikat o błędzie?

+1

Spójrz tutaj: http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zero-rows-fetched-selected-lub-processed –

Odpowiedz

16

Wszystkie DECLARE muszą znajdować się na górze. to znaczy.

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

Dobrze! To faktycznie rozwiązuje mój problem (w pgsql, nie możesz "DECLARE" przed 'BEGIN', prawie tak samo). Wystąpił kolejny błąd w tym skrypcie: 'Kod błędu: 1415. Nie można zwrócić zestawu wyników z wyzwalacza'. Wymieniłem pierwszy "SELECT" i rozwiązałem go. Ale nadal nie działa. Jeśli chcesz mi pomóc, zredagowałem mój post. – Arthur

+1

Spróbuj zastąpić 'SELECT @ m_user_team_id' przez' SET @m_user_team_id: = '. Zaktualizowałem swój post. – neubert

+0

po prostu notka: "BEGIN DECLARE m_user_team_id integer;" -> pamiętaj, aby używać DECLARE na górze kodów –

1

Zgadzam się z neubertem na temat instrukcji DECLARE, to naprawi błąd składni. Ale sugerowałbym, aby unikać używania otwartych kursorów, mogą one być wolne.

Dla swojego zadania: użyj instrukcji INSERT ... SELECT, która pomoże ci skopiować dane z jednej tabeli do drugiej za pomocą tylko jednego zapytania.

INSERT ... SELECT Syntax.

Powiązane problemy