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

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Points : 103
    Points
    103
    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 éminent sénior 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
    Points : 11 252
    Points
    11 252
    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 régulier Avatar de Nimothenicefish
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Points : 103
    Points
    103
    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 averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    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 régulier Avatar de Nimothenicefish
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Points : 103
    Points
    103
    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
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    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

  7. #7
    Membre confirmé
    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
    Points : 639
    Points
    639
    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...
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    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 !

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    Merci à vous, par contre j'aurai bien voulu télécharger ce cours car j'ai pas internet chez moi et j'aurai voulu le bosser ce soir mais il me semble que le lien est mort, donc si quelqu'un l'a déja qu'il puisse ma le faire parvenir par mail à cette adresse au plus tôt : matthieucrochet@gmail.com Merci

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par Nimothenicefish Voir le message
    il me semble que le lien est mort
    Non non, vérifié à l'instant, j'ai pu le télécharger sans souci...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    En effet il n'est pas mort, le problème était du à Firefox qui ne voulait pas le télécharger, alors j'ai pris IE qui bizarrement a bien voulu.
    En tout cas merci a vous, ca m'aura fait comprendre que j'ai pas assez bossé !

  12. #12
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Taoueret Voir le message
    ton erreur vient surement de ta clause where dans ton update.
    ...
    Mnitu, tu as le droit de faire des reflexions mais il y a différentes façons de le dire !
    Désolé mais tu te trompe. L'erreur qu'il a postée vient bien de la mauvaise syntaxe du update, plus précisément de la mauvaise utilisation des parenthèses.
    Concernant comment "le dire" c'est comme pour certaines maladies : il y a de situation ou le bistouri c'est le vrai remède.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Bonjour,
    je viens de trouver la fonction : Merge qui m'interesse et donc j'aurai voulu avoir de la doc dessus car pour l'instant je n'ai rien trouvé. Si quelqu'un pouvait me recommander une source.Merci

  14. #14
    Membre confirmé
    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
    Points : 639
    Points
    639
    Par défaut
    Quel rapport avec la discussion en cours ?

    Sinon, tu devrais trouver ton bonheur ici :
    http://oracle.developpez.com/faq/?page=3-1#merge
    puis dans le sommaire, clique sur "Comment insérer ou mettre à jour des données sans savoir si les enregistrements correspondants existent déjà ?"
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Ah pardon pour avoir poster ici.
    En tout cas merci pour le lien, j'ai en effet trouvé mon bonheur !

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