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 :

Contrainte taille colonne non respectée par sql*loader direct


Sujet :

SQL*Loader Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Contrainte taille colonne non respectée par sql*loader direct
    Lorsque j'utilise sql*loader en MODE DIRECT avec les fonctions trim (cf ctl ci-dessous), la donnée est insérée dans la base même si la longueur dépasse la taille maxi de la colonne.

    Exemple pour la colonne status :

    le ctl :

    load data
    infile '/data/in/fedex/gsmart_status_txt.10'
    replace into table STATUS_FULL_DUMP_10
    fields terminated by '|'
    trailing nullcols
    (bus_org_id "trim(:bus_org_id)",
    org_id "trim(:org_id)",
    nname "trim(:nname)",
    status "trim(:status)",
    x_downtrader "trim(_downtrader)",
    x_ship_status_cd "trim(_ship_status_cd)",
    x_country "trim(_country)",
    current_date "trim(:current_date)"
    )


    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> desc STATUS_FULL_DUMP_10
    Name Null? Type
    ----------------------------------------- -------- ----------------------------
    BUS_ORG_ID VARCHAR2(10 CHAR)
    ORG_ID VARCHAR2(20 CHAR)
    NNAME VARCHAR2(100 CHAR)
    STATUS VARCHAR2(10 CHAR)
    X_DOWNTRADER VARCHAR2(20 CHAR)
    X_SHIP_STATUS_CD VARCHAR2(20 CHAR)
    X_COUNTRY VARCHAR2(20 CHAR)
    CURRENT_DATE VARCHAR2(30 CHAR)

    SQL>

    Exemples de fichier de données (3 lignes commençant par un chiffre)
    279219536|251673225|L|PERTZ, HELGA|1|Not relevant|LOST|Germany|2008-11-14 16:03:01
    279219536|251673225|L| PERTZ, HEL|1|Not relevant|LOST|Germany|2008-11-14 16:03:01
    276529380|231848886|GR|TMACHER, GRAVERT& PARTNER|1|Not relevant|LOST|Germany|2008-11-14 16:03:01

    la quatrième colonne STATUS dans cet exemple de données fait plus de 10 caractères, si on applique la fonction trim sur STATUS, le loader ne devrait charger que la 2eme ligne et pourtant il charge sans pb les 3 lignes !!
    l erreur se produit en mode direct avec des fonctions PL (trim ou autre)!!


    extrait du log :

    Column Name Position Len Term Encl Datatype
    ------------------------------ ---------- ----- ---- ---- ---------------------
    BUS_ORG_ID FIRST * | CHARACTER
    SQL string for column : "trim(:bus_org_id)"
    ORG_ID NEXT * | CHARACTER
    SQL string for column : "trim(:org_id)"
    NNAME NEXT * | CHARACTER
    SQL string for column : "trim(:nname)"
    STATUS NEXT * | CHARACTER
    SQL string for column : "trim(:status)"
    X_DOWNTRADER NEXT * | CHARACTER
    SQL string for column : "trim(_downtrader)"
    X_SHIP_STATUS_CD NEXT * | CHARACTER
    SQL string for column : "trim(_ship_status_cd)"
    X_COUNTRY NEXT * | CHARACTER
    SQL string for column : "trim(_country)"
    CURRENT_DATE NEXT * | CHARACTER
    SQL string for column : "trim(:current_date)"


    Table STATUS_FULL_DUMP_10:
    3 Rows successfully loaded.
    0 Rows not loaded due to data errors.
    0 Rows not loaded because all WHEN clauses were failed.
    0 Rows not loaded because all fields were null.


    Dans la base apres chargement, je retrouve des données tronquées a 10c avec des longueurs trop grandes :

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> select status,length(status) from STATUS_FULL_DUMP_10;

    STATUS LENGTH(STATUS)
    ---------- --------------
    PERTZ, HEL 12
    PERTZ, HEL 10
    TMACHER, G 25

    SQL> desc STATUS_FULL_DUMP_10
    Name Null? Type
    ----------------------------------------- -------- ----------------------------
    BUS_ORG_ID VARCHAR2(10 CHAR)
    ORG_ID VARCHAR2(20 CHAR)
    NNAME VARCHAR2(100 CHAR)
    STATUS VARCHAR2(10 CHAR)
    X_DOWNTRADER VARCHAR2(20 CHAR)
    X_SHIP_STATUS_CD VARCHAR2(20 CHAR)
    X_COUNTRY VARCHAR2(20 CHAR)
    CURRENT_DATE VARCHAR2(30 CHAR)

    SQL>




    une idée ?

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    c'est ptet lié a 10.2.0.4

    en 10.2.0.3

    SQL*Loader: Release 10.2.0.3.0 - Production on Thu Nov 20 16:10:33 2008

    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    Control File: test.ctl
    Data File: c:\temp\test.csv
    Bad File: test.bad
    Discard File: none specified

    (Allow all discards)

    Number to load: ALL
    Number to skip: 1
    Errors allowed: 50
    Bind array: 64 rows, maximum of 256000 bytes
    Continuation: none specified
    Path used: Conventional

    Table STATUS_FULL_DUMP_10, loaded from every logical record.
    Insert option in effect for this table: TRUNCATE
    TRAILING NULLCOLS option in effect

    Column Name Position Len Term Encl Datatype
    ------------------------------ ---------- ----- ---- ---- ---------------------
    BUS_ORG_ID FIRST * | CHARACTER
    SQL string for column : "trim(:bus_org_id)"
    ORG_ID NEXT * | CHARACTER
    SQL string for column : "trim(:org_id)"
    NNAME NEXT * | CHARACTER
    SQL string for column : "trim(:nname)"
    STATUS NEXT * | CHARACTER
    SQL string for column : "trim(:status)"
    X_DOWNTRADER NEXT * | CHARACTER
    SQL string for column : "trim(_downtrader)"
    X_SHIP_STATUS_CD NEXT * | CHARACTER
    SQL string for column : "trim(_ship_status_cd)"
    X_COUNTRY NEXT * | CHARACTER
    SQL string for column : "trim(_country)"
    CURRENT_DATE NEXT * | CHARACTER
    SQL string for column : "trim(:current_date)"

    Record 2: Rejected - Error on table STATUS_FULL_DUMP_10, column STATUS.
    ORA-12899: value too large for column "OWNER_INTRADAY"."STATUS_FULL_DUMP_10"."STATUS" (actual: 25, maximum: 10)


    Table STATUS_FULL_DUMP_10:
    1 Row successfully loaded.
    1 Row not loaded due to data errors.
    0 Rows not loaded because all WHEN clauses were failed.
    0 Rows not loaded because all fields were null.


    Space allocated for bind array: 132096 bytes(64 rows)
    Read buffer bytes: 1048576

    Total logical records skipped: 1
    Total logical records read: 2
    Total logical records rejected: 1
    Total logical records discarded: 0

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    1 - le trim ne fait qu'enlever les espaces pas limiter la colonne
    2 - en mode direct (en utilisant directpath), aucun contrôle SQL n'est réalisé, c'est pourquoi ca passe....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    j'ai ajoute direct =y en 10.2.0.3 64 bit zindoz
    et bien ca passe pas !

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci pour vos réponses

    Effectivement le trim me permet d 'enlever les espaces devant et derrière mais si le résultat du trim est une chaine de plus de 10c dans mon exemple cela devrait bloquer non ? en mode direct ou non !

    Avant la 10g on ne pouvait pas indiquer de fonction SQL en mode direct, je trouve étonnant que maintenant que c'est permis le controle ne se fait pas !!
    surtout qu'en mode conventionnel cela bloque bien ... je n'ai pas trouve de patch pour le loader et rien dans la base de bug !

    Le comportement au niveau fonctionnel du loader en mode direct ou conventionnel devrait étre le même non ?

    Savez-vous si on peut passer en 10.2.0.3 uniquement pour le loader ? sans changer la version du noyau

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    bon, j'ai trouvé un bug sur metalink... (ref : 5873852) avec une correction effective en 11.1.

    As tu crée ta colonne en spécifiant CHAR dans la taille ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai créé la colonne en précisant VARCHAR2(10)
    j'ai le paramètre NLS_LENGTH_SEMANTICS = 'CHAR' positionné dans l'init.ora , le CHARACTER SET de la base est AL32UTF8

    le desc de la table ci-dessous (colonne STATUS)

    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> desc STATUS_FULL_DUMP_10
    Name Null? Type
    ----------------------------------------- -------- ----------------------------
    BUS_ORG_ID VARCHAR2(10 CHAR)
    ORG_ID VARCHAR2(20 CHAR)
    NNAME VARCHAR2(100 CHAR)
    STATUS VARCHAR2(10 CHAR)
    X_DOWNTRADER VARCHAR2(20 CHAR)
    X_SHIP_STATUS_CD VARCHAR2(20 CHAR)
    X_COUNTRY VARCHAR2(20 CHAR)
    CURRENT_DATE VARCHAR2(30 CHAR)

    SQL>

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    donc, tu dois avoir le bug mentionné ci dessus.... vas sur metalink et tu aura le détail qui correspond exactement à ton cas...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. Dimension de div non respectée par Firefox
    Par Zelphalya dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 05/01/2007, 13h15
  2. Champs ignorés lors d'insertion par SQL Loader
    Par Bewitch dans le forum SQL*Loader
    Réponses: 3
    Dernier message: 13/09/2006, 11h19
  3. Chargement table Oracle par SQL Loader
    Par Mike-lb dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 28/08/2006, 12h30
  4. fonction utilisateur non reconue par sql server 2000
    Par ouedmouss dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2005, 07h46
  5. Chargement de fichier par SQL LOADER
    Par davy.g dans le forum SQL*Loader
    Réponses: 17
    Dernier message: 15/11/2004, 13h08

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