Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > SQL*Loader
SQL*Loader Forum d'entraide sur Oracle SQL*Loader
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/08/2007, 17h41   #1
HoB
Membre à l'essai
 
Homme Franck Flayelle
Consultant CRM
Inscription : mai 2004
Messages : 58
Détails du profil
Informations personnelles :
Nom : Homme Franck Flayelle
Âge : 30
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : mai 2004
Messages : 58
Points : 23
Points : 23
Par défaut SQL Loader - est il obligatoire d'ajouter un type dans le CTL et pourquoi ?

Bonjour à tous,

je cherche à importer les données d'un fichier dans une base de données Oracle 9 via SQL Loader, et l'une des donnnées de ce fichier doit se retrouver dans 2 colonne distinctes : X_ATL_EXT_ID et PARTY_UID.
Pour info, en base X_ATL_EXT_ID est un varchar(15) et PARTY_UID un varchar(100)

dans mon ctl, j'ai donc fait mon ctl comme suit :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
LOAD DATA
Append
INTO TABLE EIM_ACCOUNT
WHEN fil1 = '10'
FIELDS terminated BY ";"
TRAILING NULLCOLS
(
fil1 filler,
X_ATL_EXT_ID,
ROW_ID                     SEQUENCE(1),
ACTIVE_FLG               CONSTANT 'Y',
PARTY_UID                ":X_ATL_EXT_ID"
)
et au chargement de mon fichier, j'obtenais l'erreur :
Record 2: Rejected - Error on table "EIM_ACCOUNT", column PARTY_UID.
Field in data file exceeds maximum length


apres quelques essais, un collègue me conseille de mettre CHAR(4000) dans la ligne grace à laquelle je fais ma copie (ce qui me donne la ligne suivante : PARTY_UID char(4000) ":X_ATL_EXT_ID") car il avait deja eu le problème et que cela l'avait resolu, sans qu'il sache pourquoi.
comme ca me semblait bizarre de mettre un champ de 4000 caracteres dans une colonne de 100 caracteres, j'ai fait quelques tests avec char(15) (taille du premier champ), char(100) (taille du second) et finalement VARCHAR à la place du char(4000).
les 2 premiers tests n'ont pas fonctionné mais le dernier oui.

donc voila : je n'ai pas vraiment de problème car mon import fonctionne maintenant, mais je ne suis pas certain de comprendre pourquoi et je ne trouve pas d'explication sur le net.
Je comprend d'autant moins cette correction que mon import fonctionnait tres bien en environnement de devellopement sans.
je suppose que SQL Loader a besoin qu'on lui donne une element de comparaison pour savoir le type de donnée qu'il va traiter : dans le cas ou une donnée existe à la place correspondante dans le fichier de données il considère qu'il a affaire à une chaien de caractère et sinon il faut lui donner un type, le type de la colonne qui va etre chargé ne lui suffit pas.

si quelqu'un pouvait me confirmer ou m'infirmer cela, et eventuellement me donner plus d'explications ca serait vraiment sympa, j'aime pas trop utiliser quelque chose sans savoir pourquoi ca marche.
et aussi, est-ce vraiment obligatoire d'ajouter un type, et si non comment puis je faire pour ne plus avoir mon erreur ?

merci d'avance
HoB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 17h56   #2
Membre actif
 
Avatar de Scual
 
Inscription : avril 2006
Messages : 149
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 149
Points : 185
Points : 185
Envoyer un message via MSN à Scual
Bonjour,

Je viens de jeter un oeil à la doc d'Oracle concernant SQL Loader et apparement tous les exemples font apparaitre le datatype.

http://www.csee.umbc.edu/help/oracle...67792/ch05.htm

De memoire, j'ai explicité le datatype lors de mes imports.

Quelle erreur as-tu dans ton "bad file" ?
Scual est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/08/2007, 10h09   #3
HoB
Membre à l'essai
 
Homme Franck Flayelle
Consultant CRM
Inscription : mai 2004
Messages : 58
Détails du profil
Informations personnelles :
Nom : Homme Franck Flayelle
Âge : 30
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : mai 2004
Messages : 58
Points : 23
Points : 23
Salut,

d'abord merci pour ta réponse.
pour mon .bad, il me donne juste les enregistrements en erreur en fait.

quand tu dis que tu a explicité le datatype lors de tes imports, c'est pour toutes les données ou seulement lorsque, comme moi, tu voulais en traiter une qui n'etait pas dans le fichier ? parce que en dehors de ce cas la, ca ne me semble pas obligatoire. en tous cas j'en avais jamais mis avant et ca marchait tres bien.

sinon le VARCHAR ne fonctionne pas en fait. enfin ca ne fonctionne plus, j'ai une nouvelle erreur :
Record 2: Rejected - Error on table "EIM_ACCOUNT", column PARTY_UID.
end of logical record found when reading length of varying length field

A priori, il cherche la donnée correspondante dans le fichier, tombe sur end of line et du coup ca lui plait pas
HoB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 10h05   #4
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

Je ne réponds pas forcement à la question, mais as tu essayer de formater X_ATL_EXT_ID avant de l'affecter :
ça peux être un trim ou autre, ce qui donnerais quelque chose comme :
Code :
PARTY_UID                "TRIM(:X_ATL_EXT_ID)"
Peut être que ça passe

Citation:
apres quelques essais, un collègue me conseille de mettre CHAR(4000) dans la ligne grace à laquelle je fais ma copie (ce qui me donne la ligne suivante : PARTY_UID char(4000) ":X_ATL_EXT_ID") car il avait deja eu le problème et que cela l'avait resolu, sans qu'il sache pourquoi.
comme ca me semblait bizarre de mettre un champ de 4000 caracteres dans une colonne de 100 caracteres, j'ai fait quelques tests avec char(15) (taille du premier champ), char(100) (taille du second) et finalement VARCHAR à la place du char(4000).
les 2 premiers tests n'ont pas fonctionné mais le dernier oui.
As tu essayez de mettre VARCHAR(100) tout simplement ?

Sinon, j'utilise aussi bien des fichiers avec definitions des colonnes et d'autre sans et j'ai jamais rencontrer ce genre de problème... Donc je ne peux pas aider plus que ça.

voili, voilou
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 15h27   #5
HoB
Membre à l'essai
 
Homme Franck Flayelle
Consultant CRM
Inscription : mai 2004
Messages : 58
Détails du profil
Informations personnelles :
Nom : Homme Franck Flayelle
Âge : 30
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : mai 2004
Messages : 58
Points : 23
Points : 23
Bonjour,

pour le VARCHAR(100) j'avais essayé et ca ne fonctionnait pas(d'ailleurs le VARCHAR ne fonctionnait pas non plus en fait).
j'avais pensé au trim pour enlever les espaces et du coup il ne me donnait plus d'erreur sur une donnée trop grande, mais par contre j'avais une autre erreur comme quoi il trouvait un end of line à mettre dans le fichier.

J'ai l'impression que mon problème vient du fait qu'on me met un caractere special (une sorte de Y) pour indiquer la fin de la ligne dans mon fichier de donnée (Pourquoi c'est la grande question!)
comme je fonctionne par separateur, quand j'en arrive a traiter mon party_uid il essaie de lire la donnée, tombe sur le caractere mis pour la fin de ligne et il doit interpreter ca comme s'il y avait une donnée a mettre dans le champs, sans avoir de separateur derrière pour lui indiquer la fin de la donnée. et donc il lit jusque la fin de la ligne et recupere le EOL qu'il ne veut pas inserer dans la colonne)

au final, comme je n'avais pas envie de mettre trop de requete dans mon CTL, j'ai enlevée la copie du CTL et j'ai tout mis dans le traitement SQL qui suis mon import

en tout cas merci pour vos reponses
HoB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h29.


 
 
 
 
Partenaires

Hébergement Web