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 :

Boucle sous PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Gestionnaire de base de données
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de base de données

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut Boucle sous PL/SQL
    bonjour,

    Je travaille sous la version oracle 9.2.0.8.0.
    je débute en PL/SQL.
    je suis super embêtée car je n'y arrive pas du tout.
    Voici mon problème, j'aimerai codé en PL/SQL , les trajets réalisés par le client au cours d'une journée. et Insérer ces données dans la table transport2 , je souhaite une ligne par jour et par client
    J'ai une table transport , cette table contient les données suivantes :
    le numero client, la date de depart, le lieu de depart, la date d'arrivée et le lieu d'arrivée.
    J'aimerai coder une boucle qui exécuterait pour chaque mm client et chaque mm date départ, insererait dans la même variable les lieux départ (code postaux) ,et dans une autre variable les lieux d'arrivee (code postaux).

    en final je souhaite une table transport qui contient les items suivants :
    numero client , date depart , Lieu_depart, lieu_arrivee
    1 20170731 33000-75000 75000-33000
    2 etc...
    pouvez vous m'aider svp , c'est urgent

    je vous en remercie par avance,

    cordialement

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    La version 9 d'Oracle est un impératif ? Parce qu'elle est largement obsolète (la 10g est sortie en 2003)
    Les versions récentes te proposent des fonctions de regroupement telles que LISTAGG qui simplifieraient grandement ta requête.
    Sinon, il va te falloir utiliser une requête récursive à la mode Oracle.
    En arriver à une boucle en PL/SQL ne devrait être qu'un dernier recours.
    Par ailleurs, compte tenu qu'il s'agit de manipuler les données de tes tables pour les présenter sous une forme différente, il serait préférable d'utiliser une vue qui sera toujours à jour plutôt qu'une table alimentée par une procédure.

    Edit: J'ai mal lu ta demande ou elle est mal exprimée , la récursivité ne semble pas être la réponse à ton besoin.
    Il faudrait vraiment que tu nous présentes la structure de la (ou des) table(s) de départ, celle d'arrivée, un exemple de données en entrée et ce qui est attendu en sortie et, bien sûr, ce qu tu as déjà testé pour mieux comprendre où tu rencontres un problème.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre du Club
    Femme Profil pro
    Gestionnaire de base de données
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de base de données

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut Structure de mes tables départ et resultat
    Bonjour
    Je te remercie beaucoup pour ton aide, c'est super sympa
    Alors la structure de ma table départ est
    Numclent varchar2(13),
    Datenais date,
    Datedepart date ,
    Lieu_Depart varchar2(5),
    Lieu_arr varchar2(5));

    Ma structure de la table résultat est
    Numclent varchar2(13),
    Datenais date,
    Datedepart date ,
    Lieu_Depart varchar2(165),
    Lieu_arr varchar2(165));

    Dans la table résultat je souhaite qu'il soit intégré tous les lieux départ et arrivée dans les colonnes lieu de départ et lieu d arrivée à chaque fois qu il s agisse du même numéro client, même date de naissance et même date du départ

    J'espère que je me suis mieux expliquée merci beaucoup pour ton aide, c'est très sympa

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Je suppose que tu es en train de préparer la suite du message en indiquant un exemple des données en entrée, du résultat attendu avec celles-ci.
    Sans oublier les requêtes et/ou procédures que tu as déjà essayées, sans succès apparemment.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre du Club
    Femme Profil pro
    Gestionnaire de base de données
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de base de données

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut Repondr
    J ai réalisé une requête sql avec la fonction concat. Sous mon espace sql je ne peux pas tester les fonctions. Ok/ sql . Si je me plante je mets le serveur oracle en panne . Et c est un organisme d administrateur du serveur oracle qui doit procéder à l arret . Pouvez vous m aider svp merci d avance

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Avec une version 11g ou plus récente la fonction LISTAGG aurait parfaitement répondue à votre besoin.

    Pour pallier à son absence, il reste possible de construire une fonction pivot mais cela demande de passer par du PL/SQL et des curseurs dynamiques, une complexité qui n'est pas forcément nécessaire.
    Dans votre cas, une des approches les plus simples serait donc de passer par un PL/SQL pour concaténer le tout

    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
    52
     
    DECLARE
      CURSOR C_Trajet IS
        with mydata as
          (SELECT 1 id,'01/01/2018' dt, 'PAR' dpt, 'STR' arv FROM dual UNION
          SELECT 1,'01/01/2018' , 'STR' ,  'PAR' FROM dual UNION
          SELECT 2,'01/01/2018' , 'LYO' ,  'NIC' FROM dual UNION
          SELECT 3,'01/01/2018' , 'LIL' ,  'PAR' FROM dual UNION
          SELECT 3,'07/01/2018' , 'PAR' ,  'LIL' FROM dual UNION
          SELECT 3,'07/01/2018' , 'LIL' ,  'PAR' FROM dual UNION
          SELECT 4,'05/01/2018' , 'PAR' ,  'QUE' FROM dual UNION
          SELECT 4,'05/01/2018' , 'NIC' ,  'MAR' FROM dual UNION
          SELECT 5,'19/01/2018' , 'MAR' ,  'PAR' FROM dual
          ) 
        select id, dt, dpt, arv, 
          LEAD(id) OVER(PARTITION BY null ORDER BY id) Next_Id,
          LEAD(dt) OVER(PARTITION BY id ORDER BY id,dt) Next_Dt
        from mydata;
     
      A_Trajet_Dpt VARCHAR2(250);
      A_Trajet_Arv VARCHAR2(250);
      L_RUPTURE BOOLEAN;
    BEGIN
      FOR i IN C_Trajet LOOP
        -- Concat pour même client et date départ
        IF (TRIM(A_Trajet_Dpt)) IS NULL THEN
          A_Trajet_Dpt := i.dpt;
        ELSE
          A_Trajet_Dpt := A_Trajet_Dpt||'-'||i.dpt;
        END IF;
        IF (TRIM(A_Trajet_Arv)) IS NULL THEN
          A_Trajet_Arv := i.arv;
        ELSE
          A_Trajet_Arv := A_Trajet_Arv||'-'||i.arv;
        END IF;
     
        -- Rupture client / date ?
        IF (i.id <> NVL(i.Next_Id,-1) OR i.dt <> NVL(i.Next_Dt,'01/01/1901')) THEN
          L_Rupture := TRUE;
        END IF;
     
        -- Insert    
        IF (L_Rupture) THEN
          -- INSERT à ajouter ici
          dbms_output.put_line('Ajout '||i.id||'-'||i.dt||' : Dpt '||A_Trajet_Dpt||' / Arv '||A_Trajet_Arv);
          L_Rupture := FALSE;
          A_Trajet_Dpt := NULL;
          A_Trajet_Arv := NULL;
        END IF;
      END LOOP;
    END;
    /
    A mettre à jour avec vos tables et champs réels
    En espérant aussi que les dates départ et arrivée contiennent l'heure pour traiter correctement les données de façon ordonnée chronologiquement (A défaut d'avoir une séquence contenue dans la PK)

Discussions similaires

  1. [10g] Boucle sous PL/SQL
    Par coubz82 dans le forum PL/SQL
    Réponses: 11
    Dernier message: 15/11/2013, 10h02
  2. Sous requette sql je pense ?
    Par lotus77777 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 19h40
  3. Sous-requêtes SQL
    Par mandrake256 dans le forum WinDev
    Réponses: 6
    Dernier message: 21/06/2005, 10h15
  4. format date sous postgres sql
    Par ruppert62 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 27/05/2005, 12h04
  5. Désactiver un trigger sous MS Sql Server
    Par WOLO Laurent dans le forum Développement
    Réponses: 6
    Dernier message: 03/07/2003, 12h51

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