SQL loader erreur DATE [Résolu/Fermé]

Signaler
Messages postés
34
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
15 octobre 2009
-
Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021
-
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,
A voir également:

3 réponses

Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021
418
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= ''. ''')")

Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021
418
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
Messages postés
34
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
15 octobre 2009

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')")
Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021
418
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
Messages postés
34
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
15 octobre 2009
>
Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021

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 ^^
Messages postés
13083
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
6 avril 2021
418 >
Messages postés
34
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
15 octobre 2009

Super,

Je passe en résolu alors,

bon TP