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 :

PL/SQL Positions de curseurs


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut PL/SQL Positions de curseurs
    Bonjour, j'ai un petit soucis; non pas dû à un problème algorithmique mais plutôt au fait que je ne vois pas comment représenter ce que je dois faire...

    Voici la structure de mon code actuel

    Comme vous pouvez le voir je commence par saisir un identifiant; cet identifiant va me servir à accéder à plusieurs tables via des curseurs.
    Jusque là pas de problème.

    J'accède donc avec mon c2 à la position x et y d'une borne.

    Le soucis apparaît à ce moment là. Pour mon traitement j'ai besoin du x et y de ma borne courante de curseur; mais j'ai également besoin de la suivante. Afin de faire des calculs de longueurs notamment.

    Donc au final je dois pouvoir accéder à la borne courante comme je le fais mais aussi à sa suivante. Hors là je bloque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Accept idParc prompt 'Identifiant Parcelle:';
     
     
    BEGIN
    	for c1_ligne in(select IdBorne from Sommet where IdParcelle='&idParc' order by 1) loop --borne
    		for c2_ligne in(select X,Y from Borne where IdBorne=c1_ligne.IdBorne) loop --limite borne
     
    		end loop;
    	end loop;
    END;
    /



    Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Et pourquoi ne passez-vous pas par des jointures ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Merci.

    Mon énoncé me force à utiliser les notions que je vois pour le moment en cours; s'il est vrai que je pourrais surement faire des jointures; on m'oblige à passer par la solution des curseurs puis à faire un enregistrement dans un tableau.

    Cela dit je pense que même en passant par des jointures j'en serais bloqué au même point.

  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
    Si pour appliquer votre algorithme vous avez besoin de l'identifiant d'une borne et de l'identifiant de la borne suivante (comme est-elle définie la borne suivante ?) alors qu'il soit ainsi! Commencez donc avec la lecture des identifiants que vous besoin pour appliquer votre algorithme: l'identifiant d'une borne et de la suivante.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Merci pour votre réponse.


    Effectivement c'est la solution que je recherche^^

    Le problème c'est que je ne sais pas comment je peux lire la position suivante de mon curseur justement.

    Là je le parcours juste automatiquement dans ma boucle for.

  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
    Commencez par définir "suivante". N'hésitez pas à poster un jeu d'essai.

    Niveau algorithme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pour chaque borne retourne par l'identifiant de la parcelle
      lecture de la borne "suivante"
      Si la borne suivante existe ...
      ...
      traitement de la borne et de la borne suivante
      Fin Si
    Fin Pour
    Alternativement vous pouvez commencer l'algorithme avec les deux bornes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pour chaque tuple borne et borne suivante
    ...
    Fin Pour

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tout dépend de ce qu'il faut faire, généralement quand je veux vérifier 2 enregistrements qui se suivent par curseur (php ou parfois oracle), je traite dans le second enregistrement (après avoir sauvegardé les infos précédemment)
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    boucle
     si variable renseignée (donc = enreg précédent)
     alors calcul entre index actuel et variable
     finsi
     affectation variable = index actuel.
    fin boucle
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    J'ai légèrement modifié ma façon de faire...à présent j'ai un code qui s'exécute; mais je n'obtiens toujours pas ce que je recherche.
    Peut être saurez vous capable de m'indiquer ce qu'il ne vas pas.

    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
     
    set serveroutput on;
     
     
    Accept idParc prompt 'Identifiant Parcelle:';
     
     
    DECLARE
     
    idB1 VARCHAR(5);
    posX1 INTEGER;
    posY1 INTEGER;
    idB2 VARCHAR(5);
    posX2 INTEGER;
    posY2 INTEGER;
    k INTEGER:=0;
    init VARCHAR(5) := '';
    cursor c2_ligne is (select * from Borne where IdBorne=init);
     
    BEGIN
     
    	for c1_ligne in(select IdBorne from Sommet where IdParcelle='&idParc' order by 1) loop --borne
    		--for c2_ligne in(select * from Borne where IdBorne=c1_ligne.IdBorne) loop limite borne
    		init:=c1_ligne.IdBorne;
    		if(k=0) then
    			open c2_ligne;
    			k:=k+1;
    		end if;
    		  	FETCH c2_ligne INTO idB1,posX1,posY1;
     			 DBMS_OUTPUT.PUT_LINE('Borne courante'|| idB1 || 'Position X' || posX2 || 'Position Y' || posY2);
     			 FETCH c2_ligne INTO idB2,posX2,posY2;
     			 DBMS_OUTPUT.PUT_LINE('Borne suivante'|| idB2 || 'Position X' || posX2 || 'Position Y' || posY2);
    	end loop;
    END;
    /
    Le premier for tourne bien le nombre de fois qu'il faut; mais les curseurs ne me retournent pas ce que je veux.

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Accept idParc prompt 'Identifiant Parcelle:';
     
     
    BEGIN
    	for c1_ligne in(select IdBorne from Sommet where IdParcelle='&idParc' order by 1) loop --borne
    		for c2_ligne in(select X,Y from Borne where IdBorne=c1_ligne.IdBorne) loop --limite borne
     
    		end loop;
    	end loop;
    END;
    /

    Il est possible de récupérer sur une ligne les valeurs courantes et les suivantes selon le Order by avec la fonction LEAD()

    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
     
    Accept idParc prompt 'Identifiant Parcelle:';
     
     
    BEGIN
      FOR c1_ligne IN
      (SELECT IdBorne,
        lead(IdBorne) over(partition BY IdParcelle order by IdBorne) IdBorneSuiv
      FROM Sommet
      WHERE IdParcelle='&idParc'
      ORDER BY 1
      )
      LOOP --borne
        FOR c2_ligne IN
        (SELECT X,
          lead(X) over(partition BY IdBorne order by IdBorne) X_BorneSuiv,
          Y,
          lead(Y) over(partition BY IdBorne order by IdBorne) Y_BorneSuiv
        FROM Borne
        WHERE c1_ligne.IdBorne IN (c1_ligne.IdBorne,c1_ligne.IdBorneSuiv)
        ORDER BY IdBorne
        )
        LOOP --limite borne
        END LOOP;
      END LOOP;
    END;
    /

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

Discussions similaires

  1. [PL/SQL] SQL Dynamique et curseur
    Par Loko dans le forum Oracle
    Réponses: 10
    Dernier message: 23/11/2004, 17h18
  2. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 22h02
  3. Position du curseur dans un TMemo
    Par yokito dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2003, 17h35
  4. Position du curseur
    Par gimlithedwarf dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/08/2002, 00h45
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 18h09

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