Posez votre question Signaler

SQL loader erreur DATE [Résolu]

Hellreaper 34Messages postés 26 février 2008Date d'inscription - Dernière réponse le 28 févr. 2008 à 11:39
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,
Lire la suite 

SQL loader erreur DATE »

6 réponses
Réponse
+2
moins plus
Pour la première erreur (ORA-01843)

Je viens de verifier, malheureusement, Oracle ne propose pas de type TIME (plus commode pour stocker des horaires)

Je ne sais pas si tu pourras t'en tirer avec un to_date, mais ça vaut le coup d'essayer:
Su le même modèle que tout à l'heure, il va falloir donner le format de la date en entrée, ce format est le suivant: HH24:MI

Donc ton ctl devrait ressembler à ça:
LOAD DATA
INFILE 'C:\dml_t_gares.csv'
TRUNCATE
INTO TABLE t_gares
FIELDS TERMINATED BY ';'
(GARE_ID "seq_t_gares.nextval" ,
NOM,
OUVERTURE "to_date(:OUVERTURE,'HH24:MI')",
FERMETURE "to_date(:FERMETURE,'HH24:MI')") 


D'ailleur, le message d'erreur est parlant quand tu le reportes au format de date en vigueur pour ta base (DD/MM/RR):
ORA-01843: ce n'est pas un mois valide
06:30
-> 06 Jour valide
-> 30 Mois invalide
(NOTA: les séparateurs (:/<espace>) ne semblent pas avoir un rôle determinant, mais autant le faire proprement)

ORA-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière
Le modèle de date est DD/MM/RR
Si on décompose ta première date dans le fichier:21/11/05 09:00
21/11/05 -> jusque la ça colle on a bien DD/MM/RR
09:00 -> Le format de date (DD/MM/RR) est déjà rempli, et on tente d'y entrer encore la fin de la chaine.

Cordiaelement
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour Hellreaper,

On va commencer par la seconde erreur (ORA-1830)

Ton format de date est, si j'en crois nos récents échanges: DD/MM/RR
soit:
• Numero du jour dans le mois (DD)
• Numero du mois (MM)
• Numero de l'année sur deux positions (RR)

Tes dates en entrée (ex: 21/11/05 09:00) sont du format suivant:
• Numero du jour dans le mois (DD)
• Numero du mois (MM)
• Numero de l'année sur deux positions (RR)
• Numero de l'heure dans la journée (HH24) (ATTENTION, si elle sont sur 12 heure, utilise HH ou HH12 + AM ou PM)
• Numero de minute dans l'heure (MI)

soit:
DD/MM/RR HH24:MI
Il te faut donc convertir tes dates, tout comme on a converti les nombres dans ton autre post.
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 "to_date(:DATE_DEPART,'DD/MM/RR HH24:MI')",
DATE_ARRIVEE "to_date(:DATE_ARRIVEE,'DD/MM/RR HH24:MI')",
DISTANCE,
PRIX CHAR NULLIF PRIX = 'NULL' "to_number(:PRIX,'9999999D99','NLS_NUMERIC_CHARACTERS= ''. ''')")

Ajouter un commentaire
Réponse
+0
moins plus
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')")
asevere- 28 févr. 2008 à 11:22
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
Hellreaper- 28 févr. 2008 à 11:38
Les 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 ^^
asevere- 28 févr. 2008 à 11:39
Super,

Je passe en résolu alors,

bon TP
Ajouter un commentaire
Ce document intitulé « SQL loader erreur DATE » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?