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 :

Parcourir les jours de la semaine


Sujet :

PL/SQL Oracle

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Parcourir les jours de la semaine
    Bonjour,

    Je souhaiterai faire une fonction qui sera exécuter le lundi (sa pas de problème) et cette fonction devra parcourir les jours de la semaine suivante. Je doit récupérer la date des différents jours ainsi que le libellé en français.
    Je pense à une boucle fort mais je vois comment faire.
    Les dates que je vais récupérer, je vais les insérer dans une table si le libellé du jours correspond à un libellé du jours d'une autre autre.
    Je suis suis sous oracle

    Merci d'avance de votre aide.

  2. #2
    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 totot Voir le message
    cette fonction devra parcourir les jours de la semaine suivante. Je doit récupérer la date des différents jours ainsi que le libellé en français.
    Utilisez une table calendrier

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il y a pas d'autre solution que la table calendrier?

  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
    Il est assez simple, en utilisant les fonctions pour les dates d'Oracle et une des divers techniques de générations des enregistrements: tables pivot, connect by pump, model clause, pipelined functions, récursive With, ...

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Ok
    je vais regarder s'il existe une fonction qui permet d'ajouter 7 jours à une date

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Voilà le début de ma fonction:
    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
    CREATE OR REPLACE FUNCTION INSERT_VOL RETURN VARCHAR2
     IS
      chaine VARCHAR2(100);
      dateJour Date;
      dateLundiSuivant Date;
      dateDimancheSuivant Date;
      jour VARCHAR2(50);
     BEGIN
      SELECT TRUNC(SYSDATE) INTO dateJour FROM DUAL;
      SELECT to_char(dateJour,'Day','NLS_DATE_LANGUAGE = French') INTO jours FROM dual;
      IF(jours = 'Lundi') THEN
        dateLundiSuivant := dateJour+7;
        dateDimancheSuivant := dateLundiSuivant+6;
     
      ELSE 
        chaine := 'Nous sommes pas un lundi, l''ajout des vols est donc impossible!':
      END IF;
      RETURN (chaine);
      END INSERT_VOL;
    Maintenant je bloque pour parcourir les date de la semaine suivante et pour chacun faire une requête SQL. Je voudrais parcours les jours entre le lundi et le dimanche

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je viens de finir ma fonction et cela me retourne une erreur et je ne vois pas pourquoi:
    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 INSERT_VOL RETURN VARCHAR2
     IS
      chaine VARCHAR2(100);
      dateJour Date;
      dateVendrediSuivant Date;
      dateJeudiSuivant Date;
      dateSemaine Date;
      jour VARCHAR2(50);
      nbMission NUMBER;
      nbInsert NUMBER;
     BEGIN
      SELECT TRUNC(SYSDATE) INTO dateJour FROM DUAL;
      SELECT to_char(dateJour,'Day','NLS_DATE_LANGUAGE = French') INTO jour FROM dual;
      IF(jour = 'Vendredi') THEN
        dateVendrediSuivant := dateJour+7;
        dateJeudiSuivant := dateVendrediSuivant+6;
        dateSemaine := dateVendrediSuivant;
        WHILE dateSemaine <= dateJeudiSuivant LOOP
          SELECT to_char(dateSemaine,'Day','NLS_DATE_LANGUAGE = French') INTO jour FROM dual;
          SELECT COUNT(idMission) INTO nbMission FROM MISSION_JOURS WHERE libelleJours = jour;
          IF(nbMission > 0) THEN
            nbInsert := 0;
            WHILE nbInsert <= nbMission LOOP
              INSERT INTO VOL (dateVol, idMission) VALUES (dateSemaine, (SELECT idMission FROM MISSION_JOURS WHERE libelleJours = jour));
              COMMIT;
              nbInsert := nbInsert + 1;
            END LOOP;
          END IF;
          dateSemaine := dateSemaine + 1;
        END LOOP;
        chaine := 'Les vols ont été ajoutés pour la semaine du '||dateVendrediSuivant||' au '||dateJeudiSuivant||' !';
      ELSE 
        chaine := 'Nous sommes pas un lundi, l''ajout des vols est donc impossible!';
      END IF;
      RETURN (chaine);
      EXCEPTION WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || SQLCODE || ' SQLERROR : ' || SQLERRM);
        RAISE_APPLICATION_ERROR(-20000, 'Une erreur imprévue s est pro-duite ' || 'SQLCODE : ' || SQLCODE || ' SQLERROR : ' || SQLERRM);
      END INSERT_VOL;
    erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLCODE : -1427 SQLERROR : ORA-01427: single-row subquery returns more than one row

  8. #8
    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
    Attention avec le format 'Day' : Il renvoie une chaine de 8 caractères avec des espaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TO_CHAR(SYSDATE,'Day','NLS_DATE_LANGUAGE = French') ||'#' AS DAY, DUMP(TO_CHAR(SYSDATE,'Day','NLS_DATE_LANGUAGE = French')) dmp_day, 
    				TO_CHAR(SYSDATE,'FmDay','NLS_DATE_LANGUAGE = French') ||'#' AS FmDay, DUMP(TO_CHAR(SYSDATE,'FmDay','NLS_DATE_LANGUAGE = French') ) dmp_fmday
    FROM dual
     
     
    DAY : Lundi   #	
    DMP_DAY : Typ=1 Len=8: 76,117,110,100,105,32,32,32
     
    FMDAY    : Lundi#
    DMP_FMDAY : Typ=1 Len=5: 76,117,110,100,105
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'avais remarqué, j'ai donc dû utiliser la fonction trim lorsque que je fais des comparaison avec des jours et cela fonctionne nikel.

    Sinon je ne comprend pas ce que tu m'a passé

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/10/2011, 19h03
  2. Réponses: 0
    Dernier message: 11/08/2010, 09h36
  3. Récuperer tout les jours de la semaine précédantes
    Par facilus68 dans le forum Général Java
    Réponses: 3
    Dernier message: 27/05/2009, 14h49
  4. afficher la date et les jours de la semaine
    Par k-eisti dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2007, 17h09
  5. Réponses: 5
    Dernier message: 27/07/2007, 16h54

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