SQL loader erreur DATE

Résolu
Bonjou

J'ai un souci avec mon sqlloader quand je veux charger un ficher qui contient une date ( exemple : 20:00 )

Voici mon ficher .ctl

LOAD DATA
INFILE 'C:\dml_t_gares.csv'
TRUNCATE
INTO TABLE t_gares
FIELDS TERMINATED BY ';'
(GARE_ID "seq_t_gares.nextval" ,
NOM,
OUVERTURE,
FERMETURE)

Ma table que j'ai crée:
CREATE TABLE T_GARES
(GARE_ID NUMBER(6) ,
NOM VARCHAR2(25) ,
OUVERTURE DATE ,
FERMETURE DATE );

Et mon ficher log me dit:

Enregistrement 1 : Rejeté - Erreur sur table T_GARES, colonne OUVERTURE.
ORA-01843: ce n'est pas un mois valide

mon .csv:
seq_t_gares.nextval;Bordeaux;06:30;22:00
seq_t_gares.nextval;Brest;06:45;21:45

Voila pour le premier pour ma deusième erreur, elle est toujours de type date mais

ficher .ctl
LOAD DATA
INFILE 'C:\dml_t_trains.csv'
TRUNCATE
INTO TABLE t_trains
FIELDS TERMINATED BY ';'
(TRAIN_ID "seq_t_trains.nextval" ,
DEPART_ID,
ARRIVEE_ID,
DATE_DEPART,
DATE_ARRIVEE,
DISTANCE,
PRIX CHAR NULLIF PRIX = 'NULL' "to_number(:PRIX,'9999999D99','NLS_NUMERIC_CHARACTERS= ''. ''')")

table:
CREATE TABLE T_TRAINS
(TRAIN_ID NUMBER(6),
DEPART_ID NUMBER(6),
ARRIVEE_ID NUMBER(6),
DATE_DEPART DATE,
DATE_ARRIVEE DATE,
DISTANCE NUMBER(6),
PRIX NUMBER(8,2));

Enregistrement 1 : Rejeté - Erreur sur table T_TRAINS, colonne DATE_DEPART.
ORA-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière

Mon .csv:
seq_t_trains.nextval;16;1;21/11/05 09:00;21/11/05 12:00;482;120.5
seq_t_trains.nextval;1;16;21/11/05 14:30;21/11/05 17:30;482;120.5

Merci de me dire si vous trouver quelque chose de louche,
Configuration: Windows Vista
Firefox 2.0.0.12

3 réponses

  1. Merci j'arrive a loader mais table mais les dates son toute fausse...

    Quand je fait un sélect sur ma table t_trains j'ai les dates qui ressemble a :

    DATE_DEPART DATE_ARRIVEE
    21/11/05 21/11/05
    21/11/05 21/11/05

    Or elle devrait être du format 21/11/05 + HEURE (exemple : 21/11/05 09:00)
    Je présis que j'ai bien fait tes changement dans mon .ctl

    DATE_DEPART "to_date(:DATE_DEPART,'DD/MM/RR HH24:MI')",
    DATE_ARRIVEE "to_date(:DATE_ARRIVEE,'DD/MM/RR HH24:MI')",

    Et pour ma table t_gares:

    OUVERTURE FERMETURE
    01/02/08 01/02/08
    01/02/08 01/02/08

    Ici je devrait juste avoir une heure est non une date ^^. ( je précise qu'il n'y a pas de date de format DD/MM/RR dans mon fichier .csv)

    Je présis que j'ai bien fait tes changement dans mon .ctl

    OUVERTURE "to_date(:OUVERTURE,'HH24:MI')",
    FERMETURE "to_date(:FERMETURE,'HH24:MI')")
    1. Webmaster
      Si le chargement ne pose plus de problèmes, pas d'inquiétude, c'est que tes dates sont bien là :-)

      C'est toujours cette histoire de format, qui joue à l'import, mais aussi à l'affichage...

      Pour faire simple, ton format de date (import/affichage) est régi par la variable NLS_DATE_FORMAT qui est reglé chez toi sur DD/MM/RR
      Il va donc par défaut attendre les date au format DD/MM/RR lors d'insertion, ou de sqlldr comme on l'a vu tout à l'heure.
      On l'a reglé dans le Loader en lui spécifiant que les dates qu'on lui passait était de tel ou tel format (to_date)
      Par défaut toujours, il va afficher les date au format DD/MM/RR il suffit donc de lui demander de les afficher dans un autre format!

      Une fois connecté à ta base joue la requête suivante:
      ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/RR HH24:MI';
      Et joues tes requêtes, tu vas voir que maintenant, toutes tes dates sont afficher dans le format DD/MM/RR HH24:MI

      Du coup, si tu souhaite afficher seulement les heure, il faut que tu joues la requête suivante:
      ALTER SESSION SET NLS_DATE_FORMAT='HH24:MI';
      Voilà, c'est pas des masse pratique, parceque ça régit l'affichage de toute tes dates, il faut rejouer les requêtes à chaque nouvelle connection, (ou les avoir en variable d'environnement), et les rejouer encore en cour de session si tu souhaites un autre affichage.

      Il y a une autre solution, qui va faire ça par requête, et qui ne t'es pas tout à fait inconnue:
      SELECT to_char(sysdate, 'DD/MM/RR HH24:MI') FROM DUAL;
      SELECT to_char(sysdate, 'HH24:MI') FROM DUAL;
      Voila comment obtenir la date courrante (SYSDATE) dans deux formats, sans toucher à la variable NLS_DATE_FORMAT

      Tu peux appliquer ça à tes requêtes:
      SELECT to_char(DATE_DEPART, 'DD/MM/RR HH24:MI') as DEPART, 
             to_char(DATE_ARRIVEE, 'DD/MM/RR HH24:MI') as ARRIVEE 
      FORM T_TRAINS;
      
      SELECT to_char(OUVERTURE, 'HH24:MI') as OUVERTURE,  
             to_char(FERMETURE, 'HH24:MI') as FERMETURE 
      FROM T_GARES;
      Ca donne quoi ?

      Cordialement
    2. @asevereLes deux dernière commandes que tu ma demander de taper mon afficher exactement se que je voulais merci.

      On va finalement pouvoir commencer les questions pour notre TP merci ^^