Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2008, 11h43   #1
Membre du Club
 
Avatar de Nimothenicefish
 
Étudiant
Inscription : janvier 2008
Messages : 184
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 184
Points : 66
Points : 66
Envoyer un message via MSN à Nimothenicefish Envoyer un message via Skype™ à Nimothenicefish
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 :
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 :
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.
Nimothenicefish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 11h55   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
Code :
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 12h03   #3
Membre du Club
 
Avatar de Nimothenicefish
 
Étudiant
Inscription : janvier 2008
Messages : 184
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 184
Points : 66
Points : 66
Envoyer un message via MSN à Nimothenicefish Envoyer un message via Skype™ à Nimothenicefish
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!
Nimothenicefish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 13h25   #4
Membre éclairé
 
Inscription : avril 2006
Messages : 352
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 352
Points : 378
Points : 378
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 :
1
2
3
4
5
 
begin
     SELECT count(*) INTO NbreElement FROM GEST;
     ....
end
Taoueret est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 14h06   #5
Membre du Club
 
Avatar de Nimothenicefish
 
Étudiant
Inscription : janvier 2008
Messages : 184
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 184
Points : 66
Points : 66
Envoyer un message via MSN à Nimothenicefish Envoyer un message via Skype™ à Nimothenicefish
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 ?
Nimothenicefish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 15h29   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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 :
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 15h43   #7
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
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 !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 15h44   #8
Membre éclairé
 
Inscription : avril 2006
Messages : 352
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 352
Points : 378
Points : 378
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 !
Taoueret est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 16h12   #9
Membre du Club
 
Avatar de Nimothenicefish
 
Étudiant
Inscription : janvier 2008
Messages : 184
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 184
Points : 66
Points : 66
Envoyer un message via MSN à Nimothenicefish Envoyer un message via Skype™ à Nimothenicefish
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
Nimothenicefish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 16h24   #10
Rédacteur
 
Inscription : décembre 2002
Messages : 2 397
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 397
Points : 3 298
Points : 3 298
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 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 16h34   #11
Membre du Club
 
Avatar de Nimothenicefish
 
Étudiant
Inscription : janvier 2008
Messages : 184
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 184
Points : 66
Points : 66
Envoyer un message via MSN à Nimothenicefish Envoyer un message via Skype™ à Nimothenicefish
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é !
Nimothenicefish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 16h40   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2008, 09h36   #13
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
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
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2008, 11h06   #14
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
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 !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2008, 11h13   #15
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Ah pardon pour avoir poster ici.
En tout cas merci pour le lien, j'ai en effet trouvé mon bonheur !
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h14.


 
 
 
 
Partenaires

Hébergement Web