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 :

Explication LOOP PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut Explication LOOP PL/SQL
    Bonjour à tous,

    voilà ma situation, je me retrouve avec 2 tables, une contenant 2 500 000 d'entrées et l'autre un peu plus de 6 000 000. Afin d'avoir une meilleure vue d'ensemble de mes tables, j'ai décidé de créer une table historique reprenant les informations m'intéressant en les regrouppant par jour. J'ai créer les procédures d'insertion et tout fonctionne comme je le souhaite.

    Mon problème, j'aimerais remplir cette table historique avec les données de mes 2 tables dont les premières données remontent à 2008. Je suppose que je dois faire une boucle sur mes procédures en incrémentant la date quelque part ... Je me suis un peu renseigné sur le net et sur ce qu'il y avait moyen de faire avec des loops,.. Mais je suis complètement perdu car je n'ai jamais fait de PL/SQL mais que du SQL. Si quelqu'un pouvait m'éclairer ! Merci..

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Par défaut
    Pour demarrer :
    http://docs.oracle.com/cd/B19306_01/...b14261/toc.htm

    Et je crois qu'il y'a des tutos sur developpez.net


  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Pourquoi ne pas le faire en sql ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    J'avais déjà trouvé ces informations mais je ne parviens pas à l'appliquer à mon cas ...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Citation Envoyé par McM Voir le message
    Pourquoi ne pas le faire en sql ?
    On m'a dit que le Pl/Sql était plus rapide.. Et vu la masse d'informations que j'ai.. Et puis je n'ai jamais vraiment utiliser les boucles :/..

  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
    On m'a dit que le Pl/Sql était plus rapide..


    Fais la comparaison entre une boucle PL/SQL et une requête SQL ensembliste et ton discours changera

    Sinon ta solution est tout indiquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO Histo
    (SELECT T1_Key1, T1_ch2, T2_zn1
    FROM table1, table2
    WHERE T1_Key1 = T2_Key2
    ...);

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    6.000.000 de lignes ce n'est pas forcément beaucoup.
    Essayez quand même le classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT /*+ APPEND */ INTO histo (cols)
    SELECT (cols)
      FROM courant;

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Voilà ma requête d'insertion..

    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
     
    insert into s716_history_logging (date_day_dt,nbr_user_ramses,nbr_user_georamses,
    			nbr_user_forms,nbr_user_cassandra,nbr_user_mapin,user_id)
     
    select to_date(sysdate -1) Date_day,
           max(decode(applicationname,'Ramses',nbr)) Ramses,
           max(decode(applicationname,'GeoRamses',nbr)) GeoRamses,
           max(decode(applicationname,'GeoRamsesForms',nbr)) Forms,
           max(decode(applicationname,'Cassandra Intranet',nbr)) Cassandra,
           max(decode(applicationname,'Cassandra Business Corner',nbr)) Mapin,
           1 as user_id
    from
    	(
    		select count(distinct(username)) nbr,applicationname 
    		from s716_gis_logging_dev 
    		where to_date(time_dt)=to_date(sysdate -1)
          		      and upper(username) not like '%BAC%'
    		group by applicationname
     
    		union
     
    		select count(distinct(username)),'Ramses' as applicationname 
    		from s716_login_his_dev 
    		where to_date(login_time)=to_date(sysdate -1)
          		      and upper(username) not like '%BAC%'
    	)
    Elle fonctionne très bien.. Maintenant ma question était de savoir comment je pouvais boucler dessus afin qu'elle s'exécute pour chaque date différente qui existe dans les tables "logging" & "login" depuis le début (approximativement fin 2008)..

    Je pense créer une variable date que j'initialise à ma première date, je boucle dessus, je fais mes "INSERT", et j'incrémente d'un jour.. Jusqu'à aujd.. Mais je ne sais absolument pas le transcrire =/...

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Est-ce que quelque chose de ce style pourrait fonctionner ?

    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
     
     
    DECLARE
     
    CURSOR C_Date IS
      Select distinct(time_dt)
      from s716_gis_logging_dev
      order by time_dt;
     
    LN$Date S716_Gis_Logging_Dev.Time_Dt%Type;
     
    BEGIN
      OPEN C_Date
        LOOP
          FETCH C_Date Into LN$Date;  
     
          insert into s716_history_logging (date_day_dt,nbr_user_ramses,nbr_user_georamses,
                      nbr_user_forms,nbr_user_cassandra,nbr_user_mapin,user_id)
     
          select to_date(LN$Date) Date_day,
                 max(decode(applicationname,'Ramses',nbr)) Ramses,
                 max(decode(applicationname,'GeoRamses',nbr)) GeoRamses,
                 max(decode(applicationname,'GeoRamsesForms',nbr)) Forms,
                 max(decode(applicationname,'Cassandra Intranet',nbr)) Cassandra,
                 max(decode(applicationname,'Cassandra Business Corner',nbr)) Mapin,
                 1 as user_id
          from
          (
              select count(distinct(username)) nbr,applicationname 
              from s716_gis_logging_dev 
              where to_date(time_dt)=to_date(LN$Date)
                        and upper(username) not like '%BAC%'
              group by applicationname
     
              union
     
              select count(distinct(username)),'Ramses' as applicationname 
              from s716_login_his_dev 
              where to_date(login_time)=to_date(LN$Date)
                          and upper(username) not like '%BAC%'
    	      )
     
          EXIT When C_Date%NOTFOUND;
        END LOOP;
      CLOSE C_EMP;
    END;
    Merci d'avance..

  10. #10
    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
    Pas besoin de boucle, la requête est ensembliste, donc tous les enregistrements correspondant à ton SELECT vont être créés !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE to_date(time_dt)>to_date('01/01/2008','DD/MM/YYYY')

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Il faut quand même bien que je récupère chaque date séparément non? Vu qu'il me faut "SELECT (sysdate -1) Date_Day", avec sysdate-1 = les statistiques du jour précédent. Mais ici j'aimerais 1/10/2008 avec les stats de ce jour la, 2/10/2008 ... ... ...

  12. #12
    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
    Donc au lieu de ça qui ne créé qu'un seul enregistrement par exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT to_date(sysdate -1) Date_day,
    FROM..
      (SELECT ..
      FROM ..
      WHERE to_date(time_dt)=to_date(sysdate -1)
      ..
    Tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT to_date(time_dt) Date_day,
    FROM..
      (SELECT ..
      FROM ..
      WHERE to_date(time_dt) BETWEEN &Dt_Debut AND &Dt_Fin
      ..
    Qui va créer une ligne pour chaque date comprise entre &Dt_Debut et &Dt_Fin

    Si j'ai bien saisie ta demande

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    J'ai dû chippoter encore un peu pour pouvoir parvenir à mes fins mais merci pour ces précieuses indications =) !!!

    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
    select to_date(t_dt) Date_day,
           max(decode(applicationname,'Ramses',nbr)) Ramses,
           max(decode(applicationname,'GeoRamses',nbr)) GeoRamses,
           max(decode(applicationname,'GeoRamsesForms',nbr)) Forms,
           max(decode(applicationname,'Cassandra Intranet',nbr)) Cassandra,
           max(decode(applicationname,'Cassandra Business Corner',nbr)) Mapin,
           1 as user_id
    from
    (
           select trunc(time_dt) t_dt, count(distinct(username)) nbr,applicationname 
           from s716_gis_logging_dev 
           where to_date(time_dt)>to_date('01/01/2008','DD/MM/YYYY')
                 and upper(username) not like '%BAC%'
           group by trunc(time_dt),applicationname
     
           union
     
           select trunc(login_time),count(distinct(username)),'Ramses' as applicationname 
           from s716_login_his_dev 
           where to_date(login_time)>to_date('01/01/2008','DD/MM/YYYY')
                 and upper(username) not like '%BAC%'
           group by trunc(login_time)
    )
    group by to_date(t_dt)
    order by to_date(t_dt)

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    À mon avis vous avez soit des problèmes de types de données, soit des fonctions inutiles.

    Quels sont les types de s716_gis_logging_dev.time_dt et s716_login_his_dev.login_time ?

    Au passage, est-ce que l'application Ramses est présente dans la table s716_gis_logging_dev ?

  15. #15
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Jamais de to_date sur une date !! Les résultats peuvent être faux.

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Citation Envoyé par Waldar Voir le message
    À mon avis vous avez soit des problèmes de types de données, soit des fonctions inutiles.

    Quels sont les types de s716_gis_logging_dev.time_dt et s716_login_his_dev.login_time ?

    Au passage, est-ce que l'application Ramses est présente dans la table s716_gis_logging_dev ?
    Ce sont des dates.. Non, l'application Ramses existait avant les 4 autres.. Elle est donc dans une table à part..

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez ce code-ci :
    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
    SELECT t_dt                                                                    as Date_day
         , max(case applicationname when 'Ramses'                    then nbr end) as Ramses
         , max(case applicationname when 'GeoRamses'                 then nbr end) as GeoRamses
         , max(case applicationname when 'GeoRamsesForms'            then nbr end) as Forms
         , max(case applicationname when 'Cassandra Intranet'        then nbr end) as Cassandra
         , max(case applicationname when 'Cassandra Business Corner' then nbr end) as Mapin
         , 1                                                                       as user_id
    FROM
    (
             SELECT trunc(time_dt)           as t_dt
                  , count(DISTINCT username) as nbr
                  , applicationname 
               FROM s716_gis_logging_dev 
              WHERE upper(username) NOT LIKE '%BAC%'
               -- AND time_dt >= to_date('01/01/2008','DD/MM/YYYY')
           GROUP BY trunc(time_dt)
                  , applicationname
     
           UNION ALL
     
             SELECT trunc(login_time)        as t_dt
                  , count(DISTINCT username) as nbr
                  , 'Ramses'                 as applicationname
               FROM s716_login_his_dev 
              WHERE upper(username) NOT LIKE '%BAC%'
               -- AND login_time >= to_date('01/01/2008','DD/MM/YYYY')
           GROUP BY trunc(login_time)
    )
    GROUP BY t_dt
    ORDER BY t_dt ASC;
    Le UNION ALL ne fait pas de dédoublonnage contrairement au UNION.
    J'ai supprimé les to_date inutiles, et j'ai commenté les filtres de dates dans la sous-requête puisque vous voulez toutes les données ! Je les laisse au cas où vous vouliez quand même supprimer des données parasites.

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Par défaut
    Merci Beaucoup !!!

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

Discussions similaires

  1. Create table dans une loop PL/SQL
    Par neo.51 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 04/03/2009, 10h59
  2. SQL LOADER - Explication
    Par Merzouk dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 13/08/2007, 11h06
  3. loop while, for et sql
    Par rcmn dans le forum Général Python
    Réponses: 9
    Dernier message: 02/03/2007, 19h11
  4. explication sur quelques login sql server 2k
    Par Bba_M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2006, 09h23

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