2010-07-05 31 views
0

Quelle est l'erreur?comment déclarer une variable dans un trigger et l'utiliser avec mysql?

DELIMITER $$ 

CREATE TRIGGER `Task_insert_trig` AFTER INSERT ON `task` 
FOR EACH ROW 
begin 
declare userID int; 

Set userID =(select userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id); 
insert into dashboard_event set 
Dsh_Project_Id = new.Tsk_Project_Id, 
Dsh_Actor = userID, 
Dsh_Action = 'Assign', 
Dsh_Type = 'Task', 
Dsh_Target = new.Tsk_Id, 
Dsh_Date = now(); 
$$ 
end 
DELIMITER ; 

Code d'erreur: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de la ligne 12

Code d'erreur: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « fin DELIMITER » à la ligne 1

Répondre

2

Je crois que l'erreur était lié au $$ delimiter, $$ end delimiter; est incorrect. De plus, je n'utiliserais pas de noms de variables qui pourraient être confondus avec une colonne de table (comme userID dans la table assigned_task.) La syntaxe d'insertion est également rompue. (UPDATE: en fait l'insertion était très bien, je ne savais pas vous pouvez le faire de cette façon)

Essayez

DELIMITER $$ 
CREATE TRIGGER Task_insert_trig AFTER INSERT ON task FOR EACH ROW 
begin 

Set @userID =(select userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id limit 1); 
insert into dashboard_event 
(Dsh_Project_Id , Dsh_Actor , Dsh_Action , Dsh_Type , Dsh_Target , Dsh_Date) 
values 
(new.Tsk_Project_Id, @userID, 'Assign', 'Task', new.Tsk_Id, now()); 

end $$ 
DELIMITER ; 
1

Voici mes conclusions sur le sujet.

Ceci est une citation d'un manuel:

« vous avez besoin d'un BE Bloc GIN/END lorsque vous avez plusieurs instructions dans la procédure. Vous utilisez le bloc pour inclure plusieurs instructions.

Mais ce n'est pas tout. Le bloc BEGIN/END, appelé aussi une instruction composée, est l'endroit où vous pouvez définir des variables et des flux de contrôle «

En d'autres termes:.

(Ces règles semblent appliquer aux déclencheurs et les procédures stockées dans de la même manière, car il semble que la même syntaxe est utilisée dans les deux.)

D'abord, notez qu'un groupe de contrôle de flux de mots-clés tels que IF ... END IF ou WHILE ... END WHILE est considéré comme un seul déclaration en ce qui concerne sa terminaison avec un point-virgule, c'est-à-dire qu'il est terminé dans son ensemble par un seul point-virgule à la fin de celui-ci: IF ... END IF, WHILE ... END WHILE,

Ensuite, si le corps d'un déclencheur ou d'une procédure stockée contient une seule et unique instruction, et que cette instruction n'est pas une déclaration de variable ni un groupe de mots-clés de contrôle de flux, cette instruction ne peut pas être terminée par un point-virgule. entouré d'un bloc BEGIN ... END. Par contre, si le corps d'un trigger ou d'une procédure stockée contient plus d'un stament, et en particulier s'il contient des déclarations variables et/ou des groupes de mots-clés de contrôle de flux, alors il doit être inclus dans un BEGIN ... END block. Enfin, le bloc BEGIN ... END lui-même ne doit pas être terminé par un point-virgule.

Hope this helps

2

Les besoins END être avant la $$.

Cela fonctionne dans MySQL 5.5.28 sur ce fiddle en définissant le délimiteur sur |. Par ailleurs, je recommande vraiment de ranger votre code à des fins de lisibilité - ce n'est pas un problème majeur, mais vous avez des mots-clés en majuscules, d'autres pas, d'autres enveloppés dans ``, d'autres pas, et pas d'indentation.

Je préfère personnellement les noms des choses trop - Tâche au lieu de Tss etc. Obtient vraiment mauvais quand vous voyez des acronymes partout aussi quand les mots pleins seraient beaucoup plus claire. Rant sur.

CREATE TABLE assigned_task (
    Atk_Task_Id INT NOT NULL, 
    Tsk_Project_Id INT NOT NULL); 

CREATE TABLE dashboard_event (
    Dsh_Project_Id INT NOT NULL, 
    Dsh_Actor INT NOT NULL, 
    Dsh_Action CHAR(100) NOT NULL, 
    Dsh_Type CHAR(100) NOT NULL, 
    Dsh_Target INT NOT NULL, 
    Dsh_Date DATETIME); 

CREATE TABLE Task (
    Tsk_Id INT NOT NULL, 
    Tsk_Project_Id INT NOT NULL); 

CREATE TRIGGER Task_insert_trig AFTER INSERT ON Task 
    FOR EACH ROW BEGIN 

    SET @userID = (
    SELECT userID 
    FROM assigned_task 
    WHERE Atk_Task_Id = new.Tsk_Id 
     AND Atk_Project_Id = new.Tsk_Project_Id 
    LIMIT 1); 

    INSERT INTO dashboard_event (
    Dsh_Project_Id, 
    Dsh_Actor, 
    Dsh_Action, 
    Dsh_Type, 
    Dsh_Target, 
    Dsh_Date) 
    VALUES (
    new.Tsk_Project_Id, 
    @userID, 
    'Assign', 
    'Task', 
    new.Tsk_Id, 
    NOW()); 
END 
Questions connexes