{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 31869 Date d'inscription   Statut Modérateur Dernière intervention   9 975
     
    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 31869 Date d'inscription   Statut Modérateur Dernière intervention   9 975
     
    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 31869 Date d'inscription   Statut Modérateur Dernière intervention   9 975
     
    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