Rechercher : dans
Par :

{Oracle} SQL Loader erreur date null

Dernière réponse le 20 nov 2009 à 19:53:44 afura, le 9 nov 2009 à 12:32:37 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « {Oracle} SQL Loader erreur date null » dans :
Le langage SQL VoirQu'appelle-t-on SQL? SQL (Structured Query Language, traduisez Langage de requêtes structuré) est un langage de définition de données (LDD, ou en anglais DDL Data Definition Language), un langage de manipulation de données (LMD, ou en anglais DML,...
SQL - Commande SELECT VoirLe langage de manipulation de données Le SQL est à la fois un langage de manipulation de données et un langage de définition de données. Toutefois, la définition de données est l'oeuvre de l'administrateur de la base de données, c'est pourquoi la...
Oracle - Introduction au SGBD Oracle VoirIntroduction au SGBD Oracle Oracle est un SGBD (système de gestion de bases de données) édité par la société du même nom (Oracle Corporation - http://www.oracle.com), leader mondial des bases de données. La société Oracle Corporation a été créée en...

1

jee pee, le 9 nov 2009 à 21:23:04

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



Un étranger, c'est un ami qu'on n'a pas encore rencontré.

Répondre à jee pee

2

afura, le 10 nov 2009 à 01:18:25

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

Répondre à afura

3

jee pee, le 10 nov 2009 à 08:51:36

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...
Un étranger, c'est un ami qu'on n'a pas encore rencontré.

Répondre à jee pee

4

afura, le 10 nov 2009 à 12:14:05

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 :)

Répondre à afura

5

afura, le 10 nov 2009 à 12:44:26

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 ?

Répondre à afura

6

jee pee, le 10 nov 2009 à 12:52:38

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é.

Un étranger, c'est un ami qu'on n'a pas encore rencontré.

Répondre à jee pee

7

 afura, le 16 nov 2009 à 16:05:58

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

Répondre à afura