|
|
|
|
Bonjour,
je n'arrive pas à importer une DATE qui peut être à null via sql loader de Oracle.
Voici mes différents essais dans le fichier de controle .ctl et la réponse de sqlldr :
mon premier champs DATE fonctionne :
"B_DATE" "to_date(:B_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
avec des données du genre Feb 14 2003
Le probleme se pose pour mon second champs qui est parfois NULL avec comme délimiteur la tabulation (FIELDS TERMINATED by X'09'). Dans mon exemple il est null à partir de la ligne 10441. Les premières passent bien.
essai 1 : "E_DATE" "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
=> Enregistrement 10441 : Rejeté - Erreur sur table "TFRC_TRMTH", colonne "E_DATE".
[...]
ORA-01843: ce n'est pas un mois valide
\\MAXIMUM ERROR COUNT EXCEEDED - Les statistiques données ci-dessus résultent d'une exécution partielle.
Table "TFRC_TRMTH" :
Chargement réussi de 10461 Lignes.
51 Lignes chargement impossible dû à des erreurs de données.
essai 2 : "E_DATE" NULLIF :E_DATE='NULL' "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
=> SQL*Loader-350: Erreur de syntaxe en ligne 25.
Nombre entier positif ou Nom de colonne attendu, ":" trouvé.
essai 3 : "E_DATE" DATE NULLIF :E_DATE='NULL' "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
=> SQL*Loader-350: Erreur de syntaxe en ligne 25.
Nombre entier positif ou Nom de colonne attendu, ":" trouvé.
essai 4 : "E_DATE" DATE "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
NULLIF :E_DATE='NULL'
=> ORA-01821: format de date inconnu
essai 5 : "E_DATE" "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
NULLIF :E_DATE='NULL'
=> SQL*Loader-350: Erreur de syntaxe en ligne 26.
"," ou ")" attendu, Mot-clé nullif trouvé.
essai 6 : "E_DATE" DATE TERMINATED by X'09' NULLIF :E_DATE='NULL' "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
=> Nombre entier positif ou Nom de colonne attendu, ":" trouvé.
essai 7 : "E_DATE" DATE TERMINATED by X'09' NULLIF E_DATE='NULL' "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')"
=> SQL*Loader-403: La colonne référencée E_DATE n'apparaît pas dans la table "TFRC_TRMTH".
essai 8 : "E_DATE" "decode(:E_DATE,null,null,to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English'''))"
=> Enregistrement 10441 : Rejeté colonne "E_DATE".ORA-01843: ce n'est pas un mois valide
essai 9 : "E_DATE" decode(:E_DATE,null,null,"to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')")
=> Enregistrement 10441 : Rejeté colonne "E_DATE".ORA-01843: ce n'est pas un mois valide
Est ce que quelqu'un aurait la solution ? Je bute sur ce problème depuis 24h, et je commence à être à cours d'idées... En tous cas de bonnes idées ;-)
Configuration: Windows XP Internet Explorer 7.0, SQL*Loader Release 10.2.0.4.0
Bonjour,
"E_DATE" NULLIF E_DATE='NULL' "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" En fait j'ai enlevé : devant E_DATE='NULL'. Je ne l'ai pas testé. A plus On se donne des souvenirs quand on se quitte. (Marcel Achard) |
Mille excuses je n'avais pas vu que vous aviez répondu ! Voici mon trmth.ctl :
|
Bonsoir,
"E_DATE" NULLIF :E_DATE=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" Je ne l'ai pas testé n'ayant pas Oracle sur mon PC. A plus On se donne des souvenirs quand on se quitte. (Marcel Achard) |
Merci d'avoir cherché, hélas ça ne marche pas non plus. Voici la réponse :
SQL*Loader: Release 10.2.0.4.0 - Production on Jeu. Juil. 2 10:47:36 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL*Loader-350: Erreur de syntaxe en ligne 25.
Nombre entier positif ou Nom de colonne attendu, ":" trouvé.
, "E_DATE" NULLIF :E_DATE=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_D
^ |
Sans le : la colonne n'est jamais reconnue... Non ce que je comprends pas c'est que le mot clé NULLIF ne semble jamais être reconnu, qu'il soit placé avant ou après, alors que toutes les docs en parlent !
"E_DATE" NULLIF E_DATE=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" SQL*Loader-403: La colonne référencée E_DATE n'apparaît pas dans la table "TFRC_TRMTH". "E_DATE" NULLIF :E_DATE=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" SQL*Loader-350: Erreur de syntaxe en ligne 25. Nombre entier positif ou Nom de colonne attendu, ":" trouvé. "E_DATE" DATE NULLIF :E_DATE=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" SQL*Loader-350: Erreur de syntaxe en ligne 25. Nombre entier positif ou Nom de colonne attendu, ":" trouvé. "E_DATE" "NULLIF :E_DATE=BLANKS to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" Enregistrement 1 : Rejeté - Erreur sur table "TFRC_TRMTH", colonne "E_DATE". ORA-00917: virgule absente |
Bonjour,
"E_DATE" NULLIF "E_DATE"=BLANKS "to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" car dans tous les exemples que j'ai trouvé, le nom des variables étaient toujours sans " Merci et à plus On se donne des souvenirs quand on se quitte. (Marcel Achard) |
Salut,
|
ça me paraissait être une excellente idée mais ça ne fonctionne pas non plus. J'ai aussi essayé d'utiliser le WHEN et aussi de supprimer l'option TRAILING NULLCOLS mais sans succes...
"E_DATE" DATE "DECODE(:E_DATE, null, null, to_date(:B_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" ORA-01821: format de date inconnu "E_DATE" "DECODE(:E_DATE, null, null, to_date(:B_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English''')" Enregistrement 1 : Rejeté - Erreur sur table "TFRC_TRMTH". ORA-00917: virgule absente WHEN "E_DATE" != '' Chargement réussi de 10461 Lignes. 51 Lignes chargement impossible dû à des erreurs de données. 0 Lignes chargement impossible car échec de toutes les clauses WHEN. WHEN "E_DATE" != null SQL*Loader-350: Erreur de syntaxe en ligne 5. Chaîne entre guillemets ou Identifiant HEX attendu, "null" trouvé. WHEN "E_DATE" != "null" Chargement réussi de 10461 Lignes. 51 Lignes chargement impossible dû à des erreurs de données. 0 Lignes chargement impossible car échec de toutes les clauses WHEN. WHEN "E_DATE" != "" Chargement réussi de 10461 Lignes. 51 Lignes chargement impossible dû à des erreurs de données. 0 Lignes chargement impossible car échec de toutes les clauses WHEN. |
Non j'ai parlé trop vite ! ça marche presque, il manquait une parenthese au decode et il fallait enlever le "date" :
"E_DATE" "DECODE(:E_DATE, null, null, to_date(:B_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English'''))" maintenant mon fichier plante plus loin... Un grand MERCI ! t'es un chef Christounet... trop fort ! |
Salut,
|
Apparemment en modifiant le fichier source avec des pipes au lieu des tabulations puis en changeant mon fichier controle comme ça :
FIELDS TERMINATED by '|' "E_DATE" "decode(:E_DATE, null, null, to_date(:E_DATE,'MON DD YYYY','NLS_DATE_LANGUAGE = ''English'''))" et bien là ça fonctionne !!! mais je n'ai pas le choix de mes sources, sybase me crée des fichiers avec tabulation. Je vais donc utiliser sqlplus en ligne de commande dans mon fichier de lancement sous dos pour remplacer toutes les tabulations par |, j'espère que je ne devrai pas le faire dans mes 50 fichiers. Apparement y'a pas d'autre solution, SQL Loader semble bugger sur un champs null s'il trouve deux tab côte à côte. Encore merci pour votre aide, le DECODE etait une très bonne idée... PS: le lien précédent n'apportait rien de neuf. |
Réponse post 9 & 16 :
SQL*Loader-350: Erreur de syntaxe en ligne 26. Nombre entier positif ou Nom de colonne attendu, ":" trouvé. cf. http://www.psoug.org/reference/sqlloader.html "Using the NULLIF and BLANKS keywords to handle zero length strings being loaded into numeric columns." |