Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/04/2007, 15h41   #1
Invité de passage
 
Inscription : août 2006
Messages : 19
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 19
Points : 3
Points : 3
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...
Alexandre_P est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 10h23   #2
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
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');" ?
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 10h32   #3
Invité de passage
 
Inscription : août 2006
Messages : 19
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 19
Points : 3
Points : 3
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;
/
Alexandre_P est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h30.


 
 
 
 
Partenaires

Hébergement Web