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 :

Utiliser un curseur comme une table


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut Utiliser un curseur comme une table
    Bonjour,

    Mise en situation :

    J'ai un curseur avec un paramètre, et je voudrais interpréter son résultat comme une table afin de pouvoir faire une requète sur le tableau qu'il retourne.

    Exemple simplifié de mon code (très simplifié, en effet, si ma requête se limite à ceci, je ferais autrement) :

    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
    DECLARE
    	g_last_mail   mob_dcl_subs_emails.subs_email_address%TYPE;
    
    	----------------------
    	--All el. customer
    	----------------------
    	CURSOR cur_cust
    	IS
    		SELECT	 DISTINCT (cu.customer_id)
    		  FROM	 customer cu, info_cust inf
    		 WHERE	 inf.customer_id = cu.customer_id AND inf.combo = 'blabla';
    
    	----------------------
    	--All contracts
    	----------------------
    	CURSOR cur_all_contr (
    		c_customer_id customer.customer_id%TYPE)
    	IS
    		SELECT	 DISTINCT ca.co_id, ca.value_x
    		  FROM	 contract ca, co_status costa
    		 WHERE		 ca.customer_id = c_customer_id
    				 AND costa.co_id = ca.co_id
    				 AND costa.status = 'a';
    
    	----------------------
    	--Get last email
    	----------------------
    
    	PROCEDURE get_last_mail (v_custid	IN	   customer.customer_id%TYPE,
    							 v_email	   OUT emails.email%TYPE)
    	IS
    		p_val_x   NUMBER;
    	BEGIN
    		SELECT	 email
    		  INTO	 v_email
    		  FROM	 emails e
    		 WHERE	 e.val_x IN (cur_all_contr(v_custid).value_x)
    		   AND   ROWNUM = 1
    		ORDER BY   e.date DESC;
    
    	END get_last_mail;
    ----------------------
    --Main process
    ----------------------
    BEGIN
    	FOR row_cust IN cur_cust
    	LOOP
    		get_last_mail (row_cust.customer_id, g_last_mail);
    	END LOOP;
    END;
    Le soucis étant la partie en rouge, je ne peux pas utiliser mon curseur de cette façon...
    Existe-t'il une façon d'utiliser le retour de mon curseur comme une table dans ce cas? Afin de le parcourir dans une requête?

    Merci pour votre aide.

  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
    Ça pourrait se faire via une collection probablement mais finalement à quoi bon de faire les jointures dans le PL/SQL ?
    Et ce morceau de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
       AND   ROWNUM = 1
    ORDER BY   e.date DESC;
    n’est qu’un bug en train de chercher le meilleur moment pour sortir sa tête.

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Merci pour la réponse,

    Comment placer le curseur dans une collection alors?
    --> J'utilise ce curseur à de nombreuse reprise de la même manière, c'est pourquoi je ne fais pas ma jointure directement.

    Et pour le Rownum, en réalité je fais un select avec la max date etc...
    Ici c'est juste pour montrer qu'il n'y a bien qu'une row.


    --> J'ai écrit en vitesse ce code à titre d'exemple, le code complet étant assez long.

    Merci.

  4. #4
    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
    Vous ne pouvez pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selectfrom curseur
    mais vous pouvez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select column_value from table(collection)
    .
    Donc avant, vous devez ouvrir votre curseur et remplir votre collection via un bulk fetch. La collection doit être déclarée au niveau SQL avec create Type.
    Mais, moi j’utiliserais presque toujours la jointure en SQL.

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Re-bonjour,

    Ok, merci, je me suis renseigné sur l'utilisation de collection en oracle.

    Je vais utiliser cette façon de faire (refaire la jointure à chaque fois s'annonce vraiment trop redondant).

    Je clôture le sujet si tout se passe comme prévu.

    Merci.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Proxy Voir le message
    refaire la jointure à chaque fois s'annonce vraiment trop redondant.
    Pourquoi ne pas utiliser une vue, c'est idéal pour factoriser du SQL.

Discussions similaires

  1. [AC-2010] Utiliser les valeurs d'une table comme champ d'une autre
    Par Humanisto dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/08/2014, 15h50
  2. Utiliser les données d'une table comme champs d'une autre table
    Par Jalabert dans le forum Modélisation
    Réponses: 6
    Dernier message: 03/06/2010, 08h51
  3. [débutant] utiliser un tableau comme une frameset
    Par toudoux dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 09/02/2006, 09h16
  4. [TChart] Comment utiliser le curseur sur une courbe ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/09/2005, 16h49
  5. curseur sur une table dont on ne connaît pas le nom
    Par NPortmann dans le forum Oracle
    Réponses: 4
    Dernier message: 12/07/2005, 09h04

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