{Oracle} SQL Loader erreur date null

afura -  
 afura -
Bonjour tous,

alors voilà j'essaie de charger un fichier dont l'une des colonnes est une date. Parfois la date n'est pas renseignée. Donc parfois à la place d'une valeur date j'ai NUL.
Mes fichiers ci dessous :

mon CTL:
LOAD DATA INFILE xxx.UNPACK APPEND INTO TABLE xxx TRAILING NULLCOLS (
xxx POSITION(1:9) INTEGER EXTERNAL,
DATE_APPRO POSITION(10:19) "DECODE(:DATE_APPRO,'','00', null, to_date(:DATE_APPRO,'YYYY-MM-DD'))"
)

mon fichier de données(1ligne):
édité sous Notepad++
1234567892099-12-01
123789456NULNULNULNULNULNULNULNULNULNUL

Ma log:
ORA-01847: day of month must be between 1 and last day of month

je vous avoue que j'ai pas mal cherché mais je trouve pas comment m'en sortir...
Configuration: Windows XP
Oracle 10g

6 réponses

  1. jee pee Messages postés 31995 Date d'inscription   Statut Modérateur Dernière intervention   10 016
     
    Salut,

    d'abord je ne comprends pas le decode :
    "DECODE(:DATE_APPRO,'','00', null, to_date(:DATE_APPRO,'YYYY-MM-DD'))"

    règle :

    decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)
    ou
    decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)

    donc si je prends ton decode

    quand date_appro egal '' , alors '00'
    et quand date_appro null alors to_date

    ou alors dans le sql*loader la syntaxe est autre

    Et ton fichier texte il contient NUL , soit 3 octets ou cela affiche NUL qui correspondrait à '00' hexa ??

    0
    1. afura
       
      salut jee pee,
      effectivement c'est une coquille la syntaxe est

      "DECODE(:DATE_APPRO,'00', null, to_date(:DATE_APPRO,'YYYY-MM-DD'))"

      et mon fichier de data contient des 0 en hexa à la place de ma date. Soit effectivement ce qui s'affiche en NUL dans Notepad++
      0
  2. jee pee Messages postés 31995 Date d'inscription   Statut Modérateur Dernière intervention   10 016
     
    Il faudrait que dans le décode tu donnes la valeur hexa des 10 positions, syntaxe sans garantie : X'00'

    donc decode(...,X'00000000000000000000',null,to_date...
    0
  3. afura
     
    salut jeepee,
    j'ai trouvé la solution il faut faire ça
    "DECODE(HEXTORAW(:DATE_APPRO),'', null, to_date(:DATE_APPRO,'YYYY-MM-DD'))"

    je suis trop bon :)
    0
  4. afura
     
    mais maintenant si j'ai vraiment une date alors HEXTORAW plante. comment tu fais pour détecter que tu as de l'hexa ou bien que c'est NUL soit x00 ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jee pee Messages postés 31995 Date d'inscription   Statut Modérateur Dernière intervention   10 016
     
    As tu essayé comme je t'ai indiqué, donc en cherchant une chaine de 10 octets contenant zéro hexa ?

    NULL est une notion propre à la base de donnée. Puisque une valeur zéro (binaire ou héxa c'est toujours zéro) c'est une valeur, ce n'est pas NULL qui signifie pas de valeur, non renseigné.

    0
  7. afura
     
    alors j'ai essayé avec le CTL
    DATE_APPRO POSITION(814:823) DATE "DECODE(:DATE_APPRO,X'00000000000000000000',null,TO_DATE(:DATE_APPRO,'YYYY-MM-DD'))"
    et j'ai eu une erreur sur date format :
    ORA-01821: date format not recognized
    0