2013-04-05 18 views
10

La mia domanda potrebbe essere semplice per te, se sei abituato a MySQL. Sono abituato a PostgreSQL SGBD e sto cercando di tradurre uno script PL/PgSQL in MySQL.Declare variabile Trigger MySQL

Ecco quello che ho:

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

Ma MySQL Workbench mi dà un errore su DECLARE m_projects_id. Non capisco perché ho le stesse istruzioni due righe sopra ...

Qualche suggerimento?

MODIFICA: neubert ha risolto questo errore. Grazie.

Ma ancora, quando provo ad inserire nel utenti:

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

Avete qualche idea? O meglio, sai come posso ottenere un messaggio di errore migliore?

+1

Dai un'occhiata qui: http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zero-rows-fetched-selected-or-processed –

risposta

16

Tutti i DICHIARA devono essere nella parte superiore. vale a dire.

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

Giusto! In realtà questo risolve il mio problema (in pgsql, non puoi 'DECLARE' prima di 'BEGIN', quasi lo stesso). Ho avuto un altro errore con questo script: 'Codice errore: 1415. Non è consentito restituire un set di risultati da un trigger'. Ho sostituito il primo 'SELECT' e l'ho risolto. Ma poi, ancora non funziona. Se vuoi aiutarmi, ho modificato il mio post. – Arthur

+1

Prova a sostituire 'SELECT @ m_user_team_id' con' SET @m_user_team_id: = '. Ho aggiornato il mio post. – neubert

+0

solo una nota: "BEGIN DECLARE m_user_team_id intero;" -> ricordarsi di usare DECLARE sopra i codici –

1

Accetto con neubert sulle istruzioni DECLARE, questo risolverà l'errore di sintassi. Ma ti suggerirei di evitare l'uso di cursori opzionali, potrebbero essere lenti.

Per l'attività: utilizzare INSERT ... SELECT istruzione che consente di copiare i dati da una tabella a un'altra utilizzando una sola query.

INSERT ... SELECT Syntax.

Problemi correlati