IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème de syntaxe trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nimothenicefish
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Par défaut Problème de syntaxe trigger
    Bonjour a tous,
    Je dois créer un trigger qui doit metre à jour une table principale depuis une table temporaire( les champs des deux tables étant similaires).
    -si un matricule est déja présent dans la table principale alors on fait une mise a jour dans cette table avec les valeurs de la table temporaire.
    -si un matricule n'est pas présent alors on fait une insertion dans la table principale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    CREATE OR REPLACE TRIGGER updateTempGest
    AFTER INSERT ON TEMP
    FOR EACH ROW
     
    DECLARE cpt int := 1;
    		cpt1 int := 1;
    		cpt2 int := 1;
    		cpt3 int := 1;
    		nbreElement int := "SELECT count(*) FROM GEST";		/*récupération du nombre d'élément dans la table GESTOR*/
    		ligneGest GESTOR.matr_gest%TYPE;		/*nomTable%TYPE = meme type que le champ de la table*/
    		ligneTemp TEMP.matr_gest%TYPE;
    		TYPE codeGest IS TABLE OF VARCHAR(10) INDEX BY BINARY_INTEGER;		/*création d'un type de tableau*/
    		tabGest codeGest;		/*déclaration d'un tableau*/
    		tabTemp codeGest;
    		CURSOR lectGest IS SELECT matr_gest FROM GESTOR;		/*création d'un curseur parcourant la table GEST*/
    		CURSOR lectTemp IS SELECT matr_gest FROM TEMP;
     
    BEGIN
    	OPEN lectGest;		/*ouverture du curseur*/
    	OPEN lectTemp;
     
    	/*récupération de tous les matricules de la table TEMP pour insérer dans un tableur*/
    	FOR cpt IN 1..nbreElement LOOP
    		FETCH lectTemp INTO ligneTemp;		/*passage à la ligne suivante*/
    		tabTemp(cpt) := ligneTemp;			/*enregsitrement de la valeur du matricule dans une case du tableau*/
    	END LOOP;
     
    	FOR cpt1 IN 1..nbreElement LOOP
    		FETCH lectGest INTO ligneGest;
    		tabGest(cpt1) := ligneGest;
    	END LOOP;
     
    	FOR cpt2 IN 1..nbreElement LOOP
    		FOR cpt3 IN 1..nbreElement LOOP
    			IF (tabTemp(cpt2) = tabGest(cpt3)) THEN		/*comparaison de chaque matricule des deux tableaux*/
    			UPDATE GESTOR SET 	(GESTOR.nom_gest := TEMP.nom_gest,
    								GESTOR.prenom_gest := TEMP.prenom_gest,
    								GESTOR.secteur_gest := TEMP.secteur_gest,
    								GESTOR.code_gest := TEMP.code_gest,
    								GESTOR.secteur1_gest := TEMP.secteur1_gest,
    								GESTOR.codeSecteur_gest := TEMP.codeSecteur_gest,
    								GESTOR.codeInc_gest := TEMP.codeInc_gest,
    								GESTOR.codeID_gest := TEMP.codeID_gest,
    								GESTOR.codeNom_gest := TEMP.codeNom_gest,
    								GESTOR.dateEmbauche_gest := TEMP.dateEmbauche_gest)
    			WHERE tabGest(cpt2) = tabTemp(cpt3);
    			ELSE
    				INSERT INTO GESTOR VALUES (TEMP.matr_gest,TEMP.nom_gest,TEMP.prenom_gest,TEMP.secteur_gest,TEMP.code_gest,TEMP.groupe_gest,TEMP.secteur1_gest,TEMP.codeSecteur_gest,TEMP.codeInc_gest,TEMP.codeID_gest,TEMP.codeNom_gest,TEMP.dateEmbauche_gest);
    			END IF;
    			cpt3 := cpt3 + 1;
    		END LOOP;
    		cpt2 := cpt2 + 1;
    	END LOOP;
     
    	CLOSE lectGest;		/*fermeture du curseur*/
    	CLOSE lectTemp;
     
    END;
    Mes erreurs générées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    32/4     PL/SQL: SQL Statement ignored
    32/40    PL/SQL: ORA-00907: parenthèse de droite absente
    Je croyais pouvoir faire directement un UPDATE entre les deux tables mais après pas mal de recherches je n'ai rien trouvé, du moins rien qui aille avec mon contexte!

    J'aimerais que l'on m'éclaircisse s'il vous plait.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    nbreElement int := "SELECT count(*) FROM GEST";	
    ...
    Je pense qu'on devrait ouvrir "Les perles du DVP.com" !
    Encore quelque un qui n'a pas les temps de lire la documentation avant de programmer.

  3. #3
    Membre confirmé Avatar de Nimothenicefish
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Par défaut
    Désolé mais malgrès ce que tu pense j'ai quand meme pris le temps de lire de la documantation mais pour ce cas là j'ai pas trouver ce qu'il fallait mettre.
    Si j'ai posté cet article c'est que je débute en matière de trigger donc ca serait simpa de pas me descendre comme ca, merci!

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Par défaut
    Tu ne peux pas initialiser une variable avec une requete SQL comme tu le fais

    il faut que dans ta partie declare tu déclare juste une variable NbreElement de type int

    et ensuite, au tout début du begin, tu initialise ta variable comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
         select count(*) into NbreElement from GEST;
         ....
    end

  5. #5
    Membre confirmé Avatar de Nimothenicefish
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Par défaut
    Merci a toi Taoueret, mais j'ai fini par trouver la bonne syntaxe pour ca cas là
    Mais pour ce qui est du reste, ca plante toujours.
    j'ai toujours le problème de la parenthèse droite qui est inexistante alors que toutes celle qui sont ouvertes sont fermès après !!!
    tu vois pas d'autres soucis par hasard ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Par défaut
    ton erreur vient surement de ta clause where dans ton update.

    Il te faut where matr_gest = tabtemp(cpt3). de plus, tu ne peux pas utiliser TEMP.xxx pour mettre à jour tes données. Il faut que tu te positionne sur l'enregistrement que tu souhaite (à savoir tabTemp(cpt3).xxx )

    Dans une boucle for .. in ... loop, l'incrémentation est automatique ! Inutile donc de mettre cpt2 = cpt2 + 1

    Mnitu, tu as le droit de faire des reflexions mais il y a différentes façons de le dire !

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Nimothenicefish Voir le message
    Désolé mais malgrès ce que tu pense j'ai quand meme pris le temps de lire de la documantation mais pour ce cas là j'ai pas trouver ce qu'il fallait mettre.
    Si j'ai posté cet article c'est que je débute en matière de trigger donc ca serait simpa de pas me descendre comme ca, merci!
    Ecoute, désolé mais ton code ne fait que montrer que soit t’a rien lu soit t’a rien compris. Il ne s’agit pas de corriger quoi que soit il s’agite de t’apprendre. Et désolé encore une fois c’est la totale : logique de l’algorithme, syntaxe du SQL, compression du SQL, du PL/SQL, etc…
    Voilà encore un bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    	FOR cpt2 IN 1..nbreElement LOOP
    		FOR cpt3 IN 1..nbreElement LOOP
    			IF (tabTemp(cpt2) = tabGest(cpt3)) THEN		/*comparaison de chaque matricule des deux tableaux*/
    			UPDATE GESTOR SET 	(GESTOR.nom_gest := TEMP.nom_gest,
    								GESTOR.prenom_gest := TEMP.prenom_gest,
    								GESTOR.secteur_gest := TEMP.secteur_gest,
    								GESTOR.code_gest := TEMP.code_gest,
    								GESTOR.secteur1_gest := TEMP.secteur1_gest,
    								GESTOR.codeSecteur_gest := TEMP.codeSecteur_gest,
    								GESTOR.codeInc_gest := TEMP.codeInc_gest,
    								GESTOR.codeID_gest := TEMP.codeID_gest,
    								GESTOR.codeNom_gest := TEMP.codeNom_gest,
    								GESTOR.dateEmbauche_gest := TEMP.dateEmbauche_gest)
    			WHERE tabGest(cpt2) = tabTemp(cpt3);
    			ELSE
    				INSERT INTO GESTOR VALUES (TEMP.matr_gest,TEMP.nom_gest,TEMP.prenom_gest,TEMP.secteur_gest,TEMP.code_gest,TEMP.groupe_gest,TEMP.secteur1_gest,TEMP.codeSecteur_gest,TEMP.codeInc_gest,TEMP.codeID_gest,TEMP.codeNom_gest,TEMP.dateEmbauche_gest);
    			END IF;
    			cpt3 := cpt3 + 1;
    		END LOOP;
    		cpt2 := cpt2 + 1;
    	END LOOP;
    L’erreur que tu cherche est due à la mauvais syntaxe du Update (ça c’est du SQL). Ton problème étant comme l’erreur te l’indique les parenthèses. Elles se ferment bien mais la syntaxe est erronée.
    En plus la clause Where démontre encore une fois beaucoup d’imagination mais très peu de connaissance.
    Dans ce même code l’incrémentation des compteurs est erronée.
    Et on parle plus du nombre des variables déclarées inutilement, etc.
    Ecoute, laisse tomber les triggers, et le code PL/SQL pour l’instant. Etudie le tutorial du langage SQL et travaille les exemples. Une fois que t’arrive à maîtriser ça passe au PL/SQL. Et une fois que tu maîtrises aussi le PL/SQL à un niveau décent revient aux triggers.
    Allez bon courage il te faut

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Nimothenicefish, ce que dit mnitu est peu dur sur la forme, mais je ne peux que l'appuyer sur le fond.
    J'ai ouvert ton article il y a 2 heures, mais en jetant un coup d'oeil sur ton code, j'ai vite renoncé. Ton plantage n'est pas spécifique au fait que ce soit un trigger (ça c'est un détail), mais tu as plein d'erreurs de programmation, certaines liées à la connaissance de PL/SQL, d'autres algorithmiques tout simplement.

    Alors, tu écris une procédure (un trigger !) de quelques dizaines de lignes, tu compiles, ça plante, donc tu poste ici. Mais si on te débloque sur le premier plantage, ça plantera sur un 2ème, tu nous re-sollicitera, puis un 3è, etc, etc... C'est pas comme ça qu'on bosse. A toi déjà de tester unitairement tes bouts de code, tes requêtes, parce que là on en aurait pour des heures et des pages de dactilographie à tout t'expliquer. Et c'est vrai qu'il y a des erreurs de débutant, certes, mais qui démontrent que tu n'as pas dû trop éplucher la doc., ne serait-ce que les tutoriels de ce site. Je t'en conseille un très bon pour commencer :
    http://sheikyerbouti.developpez.com/pl_sql/

    A moins que tu tombes sur quelqu'un de très disponible...

Discussions similaires

  1. Problème de syntaxe sur un TRIGGER (erreur 1064)
    Par Tchupacabra dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 08/04/2009, 14h47
  2. Problème de syntaxe de trigger
    Par banban1 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 27/05/2008, 09h44
  3. Problème de syntaxe
    Par Mister_FX dans le forum ASP
    Réponses: 5
    Dernier message: 30/06/2004, 10h01
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo