Rechercher : dans
Par :

SQL loader erreur DATE

Dernière réponse le 28 fév 2008 à 11:39:33 Hellreaper, le 27 fév 2008 à 15:44:00 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « SQL loader erreur DATE » dans :
SQL - Création de table VoirLe SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
SQL - Tri VoirTri des résultats Il est possible en SQL d'organiser les résultats grâce à la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut) ou...

1

asevere, le 28 fév 2008 à 09:33:56

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= ''. ''')")


Une belette, un lapin !?
C'est pas normal!

Répondre à asevere

2

asevere, le 28 fév 2008 à 09:51:32
  • +2

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

Une belette, un lapin !?
C'est pas normal!

Répondre à asevere

3

Hellreaper, le 28 fév 2008 à 10:59:46

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

Répondre à Hellreaper

4

asevere, le 28 fév 2008 à 11:22:36

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
Une belette, un lapin !?
C'est pas normal!

Répondre à asevere

5

Hellreaper, le 28 fév 2008 à 11:38:30

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

Répondre à Hellreaper

6

 asevere, le 28 fév 2008 à 11:39:33

Super,

Je passe en résolu alors,

bon TP
Une belette, un lapin !?
C'est pas normal!

Répondre à asevere