Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
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 07/08/2006, 10h10   #1
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
Par défaut Comparaison champs curseur avec autre table

Bonjour, suite à plusieur "cours" dont (http://www.trivadis.com/Images/nf9is...cm18-7342.pdf), j'essai de réaliser une requete, dans laquelle je dois comparer les champs HostCustomerID_DO,HostCustomerID_LI avec le tuple du curseur courant...

Voici la requete, pour y "voir un peu plus clair" :




Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE PROCEDURE mapping_customer AS
	CURSOR C_Staging IS
		SELECT * 
		FROM Staging
		WHERE (HostCustomerID_DO,HostCustomerID_LI) IN 
			(SELECT HostCustomerID_DO,HostCustomerID_LI
	 		 FROM CustomerBP
			 WHERE LocBinID IS NOT NULL 
			 OR    HostLocID IS NOT NULL);	
BEGIN
	FOR enreg IN C_Staging LOOP
		UPDATE Staging SET
			CalcLocId=(SELECT COALESCE(LocBinID,HostLocID) 
				     FROM CustomerBP
				     WHERE CustomerBP.HostCustomerID_DO=enreg.HostCustomerID_DO
				     AND   CustomerBP.HostCustomerID_LI=enreg.HostCustomerID_LI)
			WHERE	CustomerBP.HostCustomerID_DO=enreg.HostCustomerID_DO
			AND   	CustomerBP.HostCustomerID_LI=enreg.HostCustomerID_LI;				
	END;
END;
Cependant, j'ai une erreur du type :
Code :
1
2
3
4
5
6
7
8
Erreurs pour PROCEDURE MAPPING_CUSTOMER :
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
19/5     PLS-00103: Symbole ";" rencontré à la place d'un des symboles
         suivants :
         loop
         Symbole "loop" a été substitué à ";" pour continuer.
Je ne vois pas dans les différents example un END LOOP pour cette méthode (sans Fetch)...
Ya t'il une autre méthode lorsque l'on utilise les curseurs pour comparer les champs du tuple courant avec ceux d'une autre table....?
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 13h55   #2
Membre du Club
 
Avatar de Arvulis
 
Inscription : septembre 2003
Messages : 115
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : septembre 2003
Messages : 115
Points : 45
Points : 45
Envoyer un message via AIM à Arvulis
Tout d'abord, il faudrai que tu precises ton SGBD. Bon, je suppose que c'est ORACLE...

Alors, a premiere vu, je crois qu'il faut que tu déclare déjà la variable "enreg" de type %TYPE. Ensuite, on termine une boucle par END LOOP; et non END;
Arvulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h03   #3
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
Oui désolée, c'est bien Oracle...

J'ai fais plusieurs tests donc j'ai effacé par mégarde la definition d'enreg...
Par contre, j'ai toujours un problème sur un champs, alors qu'il est utilisé plusieurs fois, et que j'ai fait des copier-coller...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE PROCEDURE mapping_customer AS
	CURSOR C_Staging IS
		SELECT * 
		FROM Staging
		WHERE (HostCustomerID_DO,HostCustomerID_LI) IN 
			(SELECT HostCustomerID_DO,HostCustomerID_LI
	 		 FROM CustomerBP
			 WHERE LocBinID IS NOT NULL 
			 OR    HostLocID IS NOT NULL);	
	enreg C_Staging%ROWTYPE;
BEGIN
	FOR enreg IN C_Staging LOOP
		UPDATE Staging SET
			CalcLocId=(SELECT COALESCE(LocBinID,HostLocID) 
				     FROM CustomerBP
				     WHERE CustomerBP.HostCustomerID_DO=enreg.HostCustomerID_DO
				     AND   CustomerBP.HostCustomerID_LI=enreg.HostCustomerID_LI)
			WHERE	CustomerBP.HostCustomerID_DO=enreg.HostCustomerID_DO
			AND   	CustomerBP.HostCustomerID_LI=enreg.HostCustomerID_LI;				
	END LOOP;
END;
Code :
1
2
3
4
5
6
7
Erreurs pour PROCEDURE MAPPING_CUSTOMER :
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
13/3     PL/SQL: SQL Statement ignored
19/11    PL/SQL: ORA-00904: "CUSTOMERBP"."HOSTCUSTOMERID_LI" :
         identificateur non valide
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h17   #4
Membre du Club
 
Avatar de Arvulis
 
Inscription : septembre 2003
Messages : 115
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : septembre 2003
Messages : 115
Points : 45
Points : 45
Envoyer un message via AIM à Arvulis
En fait, je crois que ta table CUSTOMERBP est sélectionné par un from dans la sous requete, donc elle est reconnu. Or dans le UPDATE, elle n'est pas séléctionné...donc CustomerBP.HostCustomerID_LI peut ne pas etre reconnu....
En fait, je sais pas si tu peux faire un UPDATE de ce type
Arvulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h19   #5
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
Est ce que je suis obligée de stocker mes valeurs temporairement dans une autre variable ou il existe un autre moyen pour ce genre de requete...?
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h35   #6
Membre du Club
 
Avatar de Arvulis
 
Inscription : septembre 2003
Messages : 115
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : septembre 2003
Messages : 115
Points : 45
Points : 45
Envoyer un message via AIM à Arvulis
C'est la limitation du sql ça . Pour l'update, pas trop d'autre choix.

Je ferai un deuxieme curseur, à ta place, je pense.


ou un stockage dans un VARRAY.
Arvulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h38   #7
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
Si je fais un autre curseur, il faudra à chaque fois que je fasse ma requete pour stocker les elements qui m'interresse... Je peux refaire directement la requete à chaque fois?non? Le curseur est sencé accelerer les choses?

Et sinon, c'est quoi le principe du VARRAY?? En meme temps je regarde sur le net...
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h47   #8
Membre du Club
 
Avatar de Arvulis
 
Inscription : septembre 2003
Messages : 115
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : septembre 2003
Messages : 115
Points : 45
Points : 45
Envoyer un message via AIM à Arvulis
Citation:
Envoyé par zuzuu
Si je fais un autre curseur, il faudra à chaque fois que je fasse ma requete pour stocker les elements qui m'interresse... Je peux refaire directement la requete à chaque fois?non? Le curseur est sencé accelerer les choses?

Et sinon, c'est quoi le principe du VARRAY?? En meme temps je regarde sur le net...

Bah, si tu fais deux boucles imbriqués. La premiere la Boucle du curseur (C1) qui te parse ta table CustomerBP et à l'interieur la Boucle du Curseur C2 avec ton update et dans le Where les champs du Curseur C1
Qu'en penses tu ?
Faut que tu selectionnes obligatoirement de cette façon.

Par contre pour le VARRAY, ca va etre compliqué si c'est pas un type...
Arvulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 16h26   #9
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
Okay, je vais tenté cela, mais c'est que ça m'avait paru plus long alors qu'en fait c'est pareil... si ce n'est que les curseurs accélere le temps de traitement?

Merci beaucoup pour tes conseils, je vais les mettre en application et je te tiens au courant
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 09h41   #10
Membre du Club
 
Avatar de Arvulis
 
Inscription : septembre 2003
Messages : 115
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : septembre 2003
Messages : 115
Points : 45
Points : 45
Envoyer un message via AIM à Arvulis
Citation:
Envoyé par zuzuu
Okay, je vais tenté cela, mais c'est que ça m'avait paru plus long alors qu'en fait c'est pareil... si ce n'est que les curseurs accélere le temps de traitement?

Merci beaucoup pour tes conseils, je vais les mettre en application et je te tiens au courant

bah ca accelere certes mais en meme temps, on peut pas s'en passer


Pas de prob, tiens moi au courant.
Arvulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 14h46   #11
Membre régulier
 
Inscription : avril 2004
Messages : 573
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2004
Messages : 573
Points : 74
Points : 74
C'est bon, j'ai fini par trouver sans un deuxième curseur mais c'est tout comm merci...
zuzuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h11.


 
 
 
 
Partenaires

Hébergement Web