Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre du Club
    Avatar de unix27
    Inscrit en
    septembre 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : septembre 2003
    Messages : 311
    Points : 66
    Points
    66

    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:
    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?

  2. #2
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 835
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Î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 835
    Points : 13 511
    Points
    13 511

    Par défaut

    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 ?

  3. #3
    Membre du Club
    Avatar de unix27
    Inscrit en
    septembre 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : septembre 2003
    Messages : 311
    Points : 66
    Points
    66

    Par défaut

    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'));

  4. #4
    Membre du Club
    Avatar de unix27
    Inscrit en
    septembre 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : septembre 2003
    Messages : 311
    Points : 66
    Points
    66

    Par défaut

    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

  5. #5
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 835
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Î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 835
    Points : 13 511
    Points
    13 511

    Par défaut

    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;

  6. #6
    Membre du Club
    Avatar de unix27
    Inscrit en
    septembre 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : septembre 2003
    Messages : 311
    Points : 66
    Points
    66

    Par défaut

    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...

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •