Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 16h32   #1
unix27
Membre du Club
 
Avatar de unix27
 
Inscription : septembre 2003
Messages : 311
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 311
Points : 68
Points : 68
Par défaut ORA-01861: literal does not match format string

Salut,j'ai essayé plusieurs choses mais impossible de trouver la solution pour le moment

voila j'ai l'erreur suivante:
Citation:
ORA-01861: literal does not match format string
le bout de code qui plante est le suivant:

Code :
SELECT GET_NEXT_DAY(TO_CHAR(DT_PARM,'YYYYMMDD')) INTO TOTO FROM TPARAM WHERE CD_PARM='FFVV';
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE OR REPLACE
FUNCTION GET_NEXT_DAY(CURDAY VARCHAR2) 
RETURN VARCHAR2 IS 
NDAY VARCHAR2(10);
BEGIN 
	  SELECT TO_CHAR(MIN(DT_PARAM),'YYYYMMDD') INTO NDAY  
	  FROM TCAL
	  WHERE IND_VV='sw'
	  AND DT_PARAM > TO_DATE(CURDAY,'YYYYMMDD');
RETURN NDAY;
END;

Avez vous une idée sur cette erreur plz?
__________________
unix27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 16h58   #2
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous aimez les conversions (inutiles) !

On verra ça après.
Pour comprendre l'erreur collez des dbms_output sur tous vos varchar2 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION GET_NEXT_DAY(CURDAY VARCHAR2) 
RETURN VARCHAR2 IS 
    NDAY VARCHAR2(10);
BEGIN
    dbms_output.enable;
    dbms_output.put_line('CURDAY : ' || CURDAY);
 
    SELECT TO_CHAR(MIN(DT_PARAM),'YYYYMMDD')
      INTO NDAY
      FROM TCAL
     WHERE IND_VV = 'sw'
       AND DT_PARAM > TO_DATE(CURDAY,'YYYYMMDD');
 
    dbms_output.put_line('NDAY : ' || NDAY);
RETURN NDAY;
 
END;
/
Appelez le code avec une valeur fixe :
Code :
1
2
SELECT GET_NEXT_DAY(TO_CHAR(sysdate-3,'YYYYMMDD')) AS tst_fcn
  FROM DUAL;
Vos colonnes TCAL.DT_PARAM et TPARAM.DT_PARM sont-elles bien typées en date ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 17h43   #3
unix27
Membre du Club
 
Avatar de unix27
 
Inscription : septembre 2003
Messages : 311
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 311
Points : 68
Points : 68
ok merci Waldar donc la varible de sortie=
NDAY : 20130105
et les deux colonnes sont bien à date en base de donnée
je mets le bout de code complet
1/ appel de la fonction GET_NEXT_DAY
Code :
1
2
 
SELECT GET_NEXT_DAY(TO_CHAR(DT_PARM,'YYYYMMDD')) INTO TOTO FROM TPARAM WHERE CD_PARM='FFVV';
2/tombe en erreur ici:
l'erreur est sut cette ligne.
Code :
1
2
 
dbms_output.put_line('New date=(fmt)'||TO_DATE(TOTO,'DD/MM/YYYY'));
__________________
unix27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 17h57   #4
unix27
Membre du Club
 
Avatar de unix27
 
Inscription : septembre 2003
Messages : 311
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 311
Points : 68
Points : 68
Citation:
Envoyé par Waldar Voir le message
Vous aimez les conversions (inutiles) !

On verra ça après.
Pour comprendre l'erreur collez des dbms_output sur tous vos varchar2 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION GET_NEXT_DAY(CURDAY VARCHAR2) 
RETURN VARCHAR2 IS 
    NDAY VARCHAR2(10);
BEGIN
    dbms_output.enable;
    dbms_output.put_line('CURDAY : ' || CURDAY);
 
    SELECT TO_CHAR(MIN(DT_PARAM),'YYYYMMDD')
      INTO NDAY
      FROM TCAL
     WHERE IND_VV = 'sw'
       AND DT_PARAM > TO_DATE(CURDAY,'YYYYMMDD');
 
    dbms_output.put_line('NDAY : ' || NDAY);
RETURN NDAY;
 
END;
/
Appelez le code avec une valeur fixe :
Code :
1
2
SELECT GET_NEXT_DAY(TO_CHAR(sysdate-3,'YYYYMMDD')) AS tst_fcn
  FROM DUAL;
Vos colonnes TCAL.DT_PARAM et TPARAM.DT_PARM sont-elles bien typées en date ?
c'est résolu Waldar c'est dû il fallait remplacer

dbms_output.put_line('New date=(fmt)'||TO_DATE(TOTO,'DD/MM/YYYY'));
par
dbms_output.put_line('New date=(fmt)'||TO_DATE(TOTO,'YYYYMMDD'));
je ne vous ai même pas donné le bon bout de code merci pour votre effort
__________________
unix27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 18h18   #5
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ce n'est pas grave l'important est que votre problème soit résolu.
TO_CHAR au lieu de TO_DATE non ?
Dans dbms_output on n'envoie que des chaînes de caractères.

Maintenant on peut améliorer votre fonction en arrêtant toutes les conversions :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION GET_NEXT_DAY(CURDAY DATE) 
RETURN DATE IS
    NDAY date;
BEGIN
    SELECT trunc(min(dt_param)) INTO NDAY
      FROM t_cal
     WHERE ind_vv = 'sw'
       AND dt_param > trunc(CURDAY);
 
    RETURN NDAY;
END;
/
Que vous appelez comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
declare
    toto date;
begin
    SELECT GET_NEXT_DAY(DT_PARM)
      INTO TOTO
      FROM TPARAM
     WHERE CD_PARM = 'FFVV';
 
    dbms_output.put_line('New date=(fmt)'||TO_CHAR(TOTO,'YYYYMMDD'));
end;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h02   #6
unix27
Membre du Club
 
Avatar de unix27
 
Inscription : septembre 2003
Messages : 311
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 311
Points : 68
Points : 68
Citation:
Envoyé par Waldar Voir le message
Ce n'est pas grave l'important est que votre problème soit résolu.
TO_CHAR au lieu de TO_DATE non ?
Dans dbms_output on n'envoie que des chaînes de caractères.

Maintenant on peut améliorer votre fonction en arrêtant toutes les conversions :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION GET_NEXT_DAY(CURDAY DATE) 
RETURN DATE IS
    NDAY date;
BEGIN
    SELECT trunc(min(dt_param)) INTO NDAY
      FROM t_cal
     WHERE ind_vv = 'sw'
       AND dt_param > trunc(CURDAY);
 
    RETURN NDAY;
END;
/
Que vous appelez comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
declare
    toto date;
begin
    SELECT GET_NEXT_DAY(DT_PARM)
      INTO TOTO
      FROM TPARAM
     WHERE CD_PARM = 'FFVV';
 
    dbms_output.put_line('New date=(fmt)'||TO_CHAR(TOTO,'YYYYMMDD'));
end;
évidemment TO_CHAR...
__________________
unix27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h32.


 
 
 
 
Partenaires

Hébergement Web