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

Décisions SGBD Discussion :

Comparaison champs curseur avec autre table


Sujet :

Décisions SGBD

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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....?

  2. #2
    Membre régulier Avatar de Arvulis
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 117
    Points : 73
    Points
    73
    Par défaut
    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;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre régulier Avatar de Arvulis
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 117
    Points : 73
    Points
    73
    Par défaut
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    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...?

  6. #6
    Membre régulier Avatar de Arvulis
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 117
    Points : 73
    Points
    73
    Par défaut
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    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...

  8. #8
    Membre régulier Avatar de Arvulis
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 117
    Points : 73
    Points
    73
    Par défaut
    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...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    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

  10. #10
    Membre régulier Avatar de Arvulis
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 117
    Points : 73
    Points
    73
    Par défaut
    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.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    C'est bon, j'ai fini par trouver sans un deuxième curseur mais c'est tout comm merci...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] [MySQL] Select avec WHERE sur un champs d'une autre table ?
    Par danydan01 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/05/2011, 17h05
  2. Réponses: 1
    Dernier message: 08/12/2010, 13h04
  3. Réponses: 0
    Dernier message: 23/09/2009, 18h14
  4. Réponses: 17
    Dernier message: 21/04/2008, 02h21
  5. UPDATE d'une table avec test d'un champ d'une autre table
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2004, 13h30

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