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 :

Traiter ligne par ligne le résultat d'une requête


Sujet :

PL/SQL Oracle

  1. #21
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    la déclaration n'est pas bonne, ta variable sera du même type que la variable du max soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_D absence.dat_fin%TYPE;
    P.S : as-tu regardé les cours ? Parce que tu n'as pas l'air de comprendre ce que tu écris.
    ~ Lola ~

  2. #22
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    il faut déclarer la date de type date et non pas de type colonne de la base de données .
    ça compile au moins , je vais tester

  3. #23
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    oui lola06 j'ai lu le cours mais il est super long , je lis section par section .

  4. #24
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    vous les expert de pl sql , y a t-il un moyen pour déboguer pas à pas ma fonction ?

    je travaille avec oracle lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select control(123) from dual
    il bug !!

  5. #25
    Membre chevronné
    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
    Points : 1 878
    Points
    1 878
    Par défaut
    Ajoute des :
    dbms_output.put_line('Trace ce que tu veux');
    dans ta fonction control afin de savoir ce qu'il se passe dedans

    Si tu exécutes tes requêtes via SQL+ il faudra activer l'affichage des traces par la commande
    set serveroutput on size 1000000
    (Le size étant optionnel à partir de la version 11)

  6. #26
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    Si je peux me permettre, je dirais:
    . poster l'intégralité du code de la fonction
    . expliquer aussi clairement que possible ce que vous cherchez a faire (j'ai telles et telles données, je dois calculer X a partir de l'écart entre A et B, avec les conditions D,E,F, etc ...que sais-je ...).
    A lire votre premier message, j'ai l'impression que cette fonction est quasi "inutile", disons superflue - en tout cas le fait de déclarer un curseur au préalable, etc - et que la totalité des traitements pourraient être fait dans un seul "select statement" (si je peux me permettre). Si c'est juste pour calculer et renvoyer un écart entre 2 dates, dont une est conditionnelle, pas la peine de faire un "gros" truc normalement.
    Mais en lisant la suite, je ne sais plus, je ne suis pas sur de piger ce qui doit être fait.

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #27
    Membre régulier
    Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 105
    Points
    105
    Par défaut
    Peux tu mettre ton code en entier ? Ça sera plus facile.
    Le hasard ne favorise que les esprits préparés.

  8. #28
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    ok
    en fait je veux tout d'abord séléctionner les collaborateurs ayants des absence avec certains critère , ensuite je veux traiter les dates de ces absence si le nombre de jour d'un absence est supérieur à 21 jours , je souhaite afficher le résultat dans une fenetre vb6 .
    mon code :

    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
    53
    CREATE OR REPLACE FUNCTION control(cd_collab absence.cd_collab%type )return number IS
    var_collab absence.cd_collab%type;
    var_D date;
    var_D_DEB date;
    var_D_FIN date;
    nbr_jours number;
     
    CURSOR cur_absence IS
     
    SELECT a.cd_collab	cd_collab 		  			 
    From absence a,demande_absence d 
    where d.CD_DEM_ABS=a.CD_DEM_ABS
    and d.CD_ETAT= 4
    and a.CD_MOTIF in (2,3)
    and d.DAT_DEMANDE >='01/02/2012'
    order by a.cd_collab;
     
    BEGIN
    OPEN cur_absence;
     
    LOOP
     
    FETCH cur_absence INTO var_collab;
     
    	  SELECT MAX (dat_fin) INTO var_D
    	  FROM absence
    	  WHERE cd_collab = var_collab
    	  order by cd_collab;
     
     	  EXIT WHEN cur_absence%FOUND;
     
    --END LOOP;
     
    		IF var_D = var_D_DEB-1 then
    			 	nbr_jours := var_D - var_D_DEB;
    		Else 
    			 	nbr_jours := var_D_FIN - var_D_DEB;		  
    		End IF;	
     
    END LOOP;		
     
    return nbr_jours ;
     
    ---cela c'est juste pour tester
    	   F nbr_jours > 20 then 
     
     		  dbms_output.put_line('controle !!');
    	  --else
    	  	--  dbms_output.put_line('pas cette fois !!');
    	  --end if ;
     
     
    END ;
    j'arrive pas à afficher le nombre de jours !

  9. #29
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour !
    Je n'ai pas le temps de regarder cela pour le moment, mais - corrigez moi si je me trompe - si tu mets ton dbms_output après ton return, tu n'es pas prête de voir quoi que ce soit.
    Le return, comme son nom l'indique, il va renvoyer la valeur et mettre fin a l'execution de la fonction, non ?

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  10. #30
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    De plus cette instruction te fait quitter la boucle dès que tu trouves un enregistrement, donc nbr_jours n'est jamais calculé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXIT WHEN cur_absence%FOUND;
    Il faut mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXIT WHEN cur_absence%NOTFOUND;
    ~ Lola ~

  11. #31
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CURSOR cur_absence IS
     
    SELECT  a.cd_absence cd_absence		  			 
    From absence a,demande_absence d 
    where d.CD_DEM_ABS=a.CD_DEM_ABS
    and d.CD_ETAT= 4
    and a.CD_MOTIF in (2,3)
    and d.DAT_DEMANDE >='01/02/2012'
    and a.cd_collab = collab;
     
     
    BEGIN
     
    OPEN cur_absence;
     
    LOOP
     
    FETCH cur_absence INTO var_absence;
     
    	  SELECT dat_fin,dat_deb INTO var_fin,var_deb
    	  FROM absence
    	  WHERE cd_absence = var_absence;
     
    			nbr_jours := var_fin - var_deb;
    			--temp:= var_fin;
     
    	  return nbr_jours;
     
     
    EXIT WHEN cur_absence%NOTFOUND;
    je sais pas comment calculer la somme des nombre des jours des absences par personne , il m'affiche que la différence d'une seule absence exp:

    absence 1: 01/02/2012 30/01/12 nbr_jours 29
    absence : 03/03/2012 30/03/12

    il faut qu'il m'affiche 29 +27 = 56 or lui il me retourne que 29 qui correspond au nombre du jour de la première absence .

    j'arrive pas à faire une boucle dans le fetch .....

  12. #32
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par pupucette Voir le message
    je sais pas comment calculer la somme des nombre des jours des absences par personne , il m'affiche que la différence d'une seule absence exp:

    absence 1: 01/02/2012 30/01/12 nbr_jours 29
    absence : 03/03/2012 30/03/12

    il faut qu'il m'affiche 29 +27 = 56 or lui il me retourne que 29 qui correspond au nombre du jour de la première absence .

    j'arrive pas à faire une boucle dans le fetch .....
    C'est normal, le return stoppe ta fonction. Donc dès le premier résultat celle-ci est arrêtée.

    Tu dois mettre ton RETURN après ta boucle et calculer nbr_jours de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbr_jours := ( var_fin - var_deb );
    nbr_tot := nbr_tot + nbr_jours;
    Et tu retourne nbr_tot.
    ~ Lola ~

  13. #33
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    oui justement , mais lorsque j'ai essayé tout à l'heure en mettant mon return a la fin il me retourne rien du tout !!!

  14. #34
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par pupucette Voir le message
    oui justement , mais lorsque j'ai essayé tout à l'heure en mettant mon return a la fin il me retourne rien du tout !!!
    Montre nous ton code intégral
    ~ Lola ~

  15. #35
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    ça marche :!!!

  16. #36
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    comment je pourrais initialiser une date à 0 en pl sql ?

  17. #37
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    ça n'existe pas apparemment !
    bon mon problème c'est que je veux calculer pour chaque collab les nombre d'absence , si celles ci se suivent exp:

    01/04/2012 30/04/2012
    01/05/2012 15/05/2012

    la il me prendra (15/05/2012-01/04/2012)

    voici mon programme il marche mais il me retourne pas les bonnes valeur , car à mon avis les variable temp et temp_deb doivent etre initialiser .

    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
    53
    54
    55
    56
    CREATE OR REPLACE FUNCTION control(collab absence.cd_collab%type)return number IS
    var_absence absence%rowtype;
    var_D date;
    var_fin date;
    var_deb date;
    temp date;
    nbr_jours number;
    nbr_total number;
    temp_deb date;
     
    CURSOR cur_absence IS
     
    SELECT  a.*	  			 
    From absence a,demande_absence d 
    where d.CD_DEM_ABS=a.CD_DEM_ABS
    and d.CD_ETAT= 4
    and a.CD_MOTIF in (2,3)
    and d.DAT_DEMANDE >='01/02/2012'
    and a.cd_collab = collab
    order by (a.dat_fin)asc ;
     
    BEGIN
     
    nbr_total:=0;
     
    OPEN cur_absence;
    --temp-deb := null;
    LOOP
     
    FETCH cur_absence INTO var_absence;
     
    		if var_absence.dat_deb = temp+1 then 
     
    			nbr_jours := (var_absence.dat_fin - temp_deb);
     
    		else
     
    			nbr_jours := (var_absence.dat_fin - var_absence.dat_deb);
     
    		end if ;
     
    		nbr_total := nbr_total+nbr_jours;
     
    		temp := var_absence.dat_fin;
     
    		temp_deb := var_absence.dat_deb;
     
     
    EXIT WHEN cur_absence%NOTFOUND;	
     
    END LOOP;
     
    return nbr_total;	
     
    end;
    /

  18. #38
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    En reprenant ton code et en le simplifiant, j'ai ajouté un test sur la valeur des variables.
    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
    CREATE OR REPLACE 
        FUNCTION    control(p_collab absence.cd_collab%TYPE)
            RETURN  number 
    IS
        nbr_total   NUMBER  := 0;
        temp_fin    absence.dat_deb%TYPE := NULL;
        temp_deb    absence.dat_fin%TYPE := NULL;
     
        CURSOR cur_absence IS
            SELECT  a.dat_deb
                ,   a.dat_fin	  			 
            FROM    absence a
                INNER JOIN
                    demande_absence d 
                    ON  d.cd_dem_abs = a.cd_dem_abs
            WHERE   d.cd_etat = 4
                AND d.dat_demande >= TO_DATE('01/02/2012', 'DD/MM/YYYY')
                AND a.cd_motif  IN (2,3)
                AND a.cd_collab = p_collab
            ORDER BY a.dat_fin
        ;
        var_absence cur_absence%ROWTYPE;
    BEGIN
        OPEN cur_absence;
        LOOP
            FETCH cur_absence INTO var_absence;
            EXIT WHEN cur_absence%NOTFOUND;
            IF  temp_fin IS NOT NULL AND temp_deb IS NOT NULL AND var_absence.dat_deb = temp_fin + 1
            THEN
    			nbr_total := nbr_total + (var_absence.dat_fin - temp_deb);
    		ELSE
    			nbr_total := nbr_total + (var_absence.dat_fin - var_absence.dat_deb);
    		END IF ;
    		temp_fin := var_absence.dat_fin;
    		temp_deb := var_absence.dat_deb;
        END LOOP;
        RETURN nbr_total;	
    END;
    /
    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.

  19. #39
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    A quel moment la variable "temp" prends une valeur ?
    Je vois:
    puis ensuite, sans autre traitement sur "temp", on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF var_absence.dat_deb = temp+1 then 
    ...
    On est bien d'accord qu'a ce moment la, temp est NULL, ok ?
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  20. #40
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par pupucette Voir le message
    bon mon problème c'est que je veux calculer pour chaque collab les nombre d'absence , si celles ci se suivent exp:

    01/04/2012 30/04/2012
    01/05/2012 15/05/2012

    la il me prendra (15/05/2012-01/04/2012)
    Re-bonsoir,
    En lisant ce qui est ci dessus, me vient l'envie de faire un petit test...
    Je fais une table pour jouer, avec qq données:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    CREATE TABLE MY_TEST_TABLE
    (
      ID_COLLAB  INTEGER,
      DATE_DEB   DATE,
      DATE_FIN   DATE
    )
    TABLESPACE USERS
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
     
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('04/01/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('04/30/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('05/01/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/15/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('06/01/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('06/15/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('01/15/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('01/25/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('01/26/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('01/31/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (2, TO_DATE('12/15/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('12/31/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (1, TO_DATE('02/01/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('02/02/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (2, TO_DATE('05/01/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/03/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (2, TO_DATE('05/05/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/07/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (2, TO_DATE('05/09/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/11/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into MY_TEST_TABLE
       (ID_COLLAB, DATE_DEB, DATE_FIN)
     Values
       (2, TO_DATE('05/12/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/15/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
    COMMIT;
    Ensuite, avec le bout de code suivant:
    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
     
    SELECT   id_collab
           ,     'Absences consécutives du '
              || TO_CHAR ( lv_date, 'dd-Mon-YY' )
              || ' au '
              || TO_CHAR ( MAX ( date_fin ), 'dd-Mon-YY' )
              || ', nombre de jours: '
              || SUM ( nb_jours_par_period )
                   results
        FROM (SELECT d.*, COUNT ( 1 ) OVER (PARTITION BY d.id_collab, d.lv_date) flt_periods
                FROM (SELECT c.id_collab
                           ,  c.date_deb
                           ,  c.date_fin
                           ,  c.nb_jours_par_period
                           ,  c.previous_end_date
                           ,  c.period_start_date
                           ,  LAST_VALUE ( c.period_start_date IGNORE NULLS )
                                   OVER (PARTITION BY id_collab ORDER BY c.date_deb)
                                   lv_date
                        FROM (SELECT b.*
                                   ,  CASE
                                           WHEN ( b.previous_end_date IS NULL
                                               OR b.previous_end_date !=   date_deb
                                                                         - 1 )
                                            AND date_deb IS NOT NULL
                                           THEN
                                                date_deb
                                      END
                                           period_start_date
                                FROM (SELECT a.*
                                           ,    a.date_fin
                                              - a.date_deb
                                                   nb_jours_par_period
                                           ,  LAG ( a.date_fin ) OVER (PARTITION BY a.id_collab ORDER BY a.date_deb)
                                                   previous_end_date
                                        FROM MY_TEST_TABLE a) b) c) d)
       WHERE flt_periods > 1
    GROUP BY id_collab, lv_date
    ORDER BY 1
    Je peux retrouver les plages d'absences consécutives par "collab", et le nombre de jours par plages.
    Reste a filtrer sur le "collab" (variable passée en paramètre d'une fonction par exemple), et savoir sur quelle période de temps on veut observer les éventuelles plages d'absences consécutives.

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/07/2011, 14h16
  2. Affichage par "section" des résultats d'une requête
    Par tiboleo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/02/2010, 16h43
  3. Calcul ligne par ligne sur le résultat d'une requête
    Par CanardJM dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/04/2008, 13h06
  4. Charger une texture ligne par ligne
    Par YéTeeh dans le forum OpenGL
    Réponses: 6
    Dernier message: 09/05/2006, 09h58
  5. aditionner les champs d'une table ligne par ligne
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/08/2005, 08h38

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