IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL*Loader Oracle Discussion :

SQL Loader - est il obligatoire d'ajouter un type dans le CTL et pourquoi ?


Sujet :

SQL*Loader Oracle

  1. #1
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué Avatar de Scual
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 149
    Points : 189
    Points
    189
    Par défaut
    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" ?
    Diction de DBA :
    "Tant va la cruche à l'eau qu'à la fin, ça me les brise"
    -------------------------------------
    Working on Oracle Database 10g / 11g
    -------------------------------------
    Article d'installation d'Oracle 10g AS Portal by Maxime GONTCHAROV
    labo-oracle.com

  3. #3
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    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

  4. #4
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    PARTY_UID                "TRIM(:X_ATL_EXT_ID)"
    Peut être que ça passe

    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
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  5. #5
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/04/2011, 21h42
  2. SQL*LOADER est-il possible avec oracle 10g EX ?
    Par startout dans le forum Import/Export
    Réponses: 2
    Dernier message: 23/12/2009, 17h52
  3. Réponses: 7
    Dernier message: 05/05/2008, 13h39
  4. Réponses: 1
    Dernier message: 08/03/2007, 12h35
  5. [SQL*LOADER]Tabulation est-ce un Séparateur
    Par jejam dans le forum Oracle
    Réponses: 5
    Dernier message: 21/08/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo