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 :

ORA-01858 dans fonction PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut ORA-01858 dans fonction PL/SQL
    Bonjour,

    J'essaie de faire une fonction qui me donnera le nb de jours ouvrés entre 2 dates (avec accès à une table qui contient les jours fériés).

    Je débute en PL/SQL et je bloque dès le début de ma fonction: sur le code ci-dessous, c'est l'alimentation de la variable DATE_VAR2 qui renvoie le 01858 mais je ne vois pas pourquoi.

    CREATE OR REPLACE FUNCTION FCT_NB_JOURS_OUVRES(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2, TYPE_CALC INTEGER) RETURN NUMBER IS

    /******************************************************************************
    Renvoie le nombre de jours ouvrés entre 2 dates
    paramètre 1 (date_deb) = date de début au format 'JJ/MM/AAAA'
    paramètre 2 (date_fin) = date de fin au format 'JJ/MM/AAAA'
    paramètre 3 (type_calc) = type de calcul
    1 = Général
    2 = Alsace-Moselle
    utilise la table XFERIES
    ******************************************************************************/

    NB_JO NUMBER(3);
    DATE_VAR VARCHAR2(20);
    DATE_VAR2 DATE;
    NO_JOUR VARCHAR2(1);

    BEGIN
    NB_JO := 0;
    DATE_VAR := DATE_DEB;


    WHILE DATE_VAR <> DATE_FIN LOOP

    DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR');
    NO_JOUR := TO_CHAR(DATE_VAR2, 'D');


    Si quelqu'un a une idée, merci d'avance...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Par défaut
    En créant cette fonction je ne rencontre pas l'erreur :
    CREATE OR REPLACE FUNCTION TEST(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2) RETURN NUMBER IS
    NB_JO NUMBER(3);
    DATE_VAR VARCHAR2(20);
    DATE_VAR2 DATE;
    NO_JOUR VARCHAR2(1);
    BEGIN
    NB_JO := 0;
    DATE_VAR := DATE_DEB;
    DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR');
    END;

    tu es sur que l'erreur vient de "DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR');" ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    Bonjour

    D'après mes tests (j'ai fait ça avec TOAD), c'était bien cette ligne qui posait problème.

    J'ai finalement résolu mon problème hier soir, je mets mon code ci-dessous. Il est évident qu'il pourrait être amélioré (il faut notamment mettre tous les jours de l'année dans la table XFERIES et pas uniquement les jours fériés) mais je verrai cela plus tard.

    CREATE OR REPLACE FUNCTION Fct_Nb_Jours_Ouvres(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2, TYPE_CALC INTEGER) RETURN NUMBER IS

    /******************************************************************************
    Renvoie le nombre de jours ouvrés entre 2 dates
    paramètre 1 (date_deb) = date de début au format 'JJ/MM/AAAA'
    paramètre 2 (date_fin) = date de fin au format 'JJ/MM/AAAA'
    paramètre 3 (type_calc) = type de calcul
    1 = Général
    2 = Alsace-Moselle
    Utilise la table XFERIES (attention, cette table doit obligatoirement
    contenir tous les jours de l'année)
    ******************************************************************************/

    DATE_VAR VARCHAR2(20);
    DATE_VAR2 DATE;
    NO_JOUR VARCHAR2(1);
    JF NUMBER(1);
    NB_JO NUMBER(3);

    BEGIN
    NB_JO := 0;
    DATE_VAR := DATE_DEB;

    LOOP

    DATE_VAR2 := TRUNC(TO_DATE(DATE_VAR, 'DD/MM/YYYY'));
    NO_JOUR := TO_CHAR(DATE_VAR2, 'D');

    IF NO_JOUR IN ('1', '2', '3', '4', '5') THEN
    IF TYPE_CALC = 1 THEN
    SELECT GENERAL INTO JF FROM XFERIES WHERE DATE_FERIEE = DATE_VAR2;
    IF JF <> 1 THEN
    NB_JO := NB_JO + 1;
    END IF;
    ELSE
    SELECT ALSACE_MOSELLE INTO JF FROM XFERIES WHERE DATE_FERIEE = DATE_VAR2;
    IF JF <> 1 THEN
    NB_JO := NB_JO + 1;
    END IF;
    END IF;
    END IF;

    EXIT WHEN DATE_VAR = DATE_FIN;

    DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/YYYY') + 1;
    DATE_VAR := TO_CHAR(DATE_VAR2, 'DD/MM/YYYY');

    END LOOP;

    RETURN NB_JO;

    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    NULL;
    WHEN OTHERS THEN
    RAISE;

    END Fct_Nb_Jours_Ouvres;
    /

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

Discussions similaires

  1. Erreur ORA-4030 dans Procédure PL/SQL
    Par nicolas.dron dans le forum PL/SQL
    Réponses: 7
    Dernier message: 09/01/2009, 18h07
  2. requete sql dans fonction javascript
    Par griese dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/06/2006, 09h44
  3. [10g]ORA-01008 dans SQL*Loader
    Par isa06 dans le forum SQL
    Réponses: 3
    Dernier message: 11/05/2006, 17h17
  4. Fonction UPDATE dans un ADOQuery - SQL
    Par yanba dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/03/2006, 13h53
  5. Réponses: 6
    Dernier message: 24/12/2004, 16h46

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