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 : maj de données existantes avec APPEND


Sujet :

SQL*Loader Oracle

  1. #1
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut SQL Loader : maj de données existantes avec APPEND
    tout le monde,

    je découvre SQL Loader et je dois avouer que c'est super pratique et super performant

    cependant, je suis confronté à un cas qui sera rare mais qui me pourrit bien la vie

    Voilà :
    avec sqlldr, je charge un fichier dans une table spécifique en mode APPEND afin d'ajouter de nouvelles données sans les supprimer.
    Il peut arriver parfois que certaines données existantes doivent être mises à jour.

    Alors, j'ai fait le test suivant :
    charger ma table avec des données qui n'existent pas -> ok
    recharger ma table avec les mêmes données -> ko.
    j'ai l'erreur suivante :
    ORA-39776: fatal Direct Path API error loading table SCHEMA.MATABLE
    ORA-26027: unique index SCHEMA.INDEXPK partition SYS_SUBP61 initially in unusable state
    SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
    Alors, d'après ce que je comprends, cela veut dire qu'il ne peut pas insérer la donnée à cause de ma contrainte.. Normal

    Moi, ce que je souhaiterais faire c'est :
    - soit que la donnée se mette à jour au moment du loader
    - soit qu'il me génère un fichier bad que je puisse traiter après

    Hors, actuellement, il me crache l'erreur et il s'arrête sans me générer le fichier bad.

    J'aimerais savoir si que je veux faire est possible ?

    Merci de votre aide

    PS : voici mon script qui lance le loader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    rm bad.txt
    rm log.txt
    rm discard.txt
    rm sqlldr.txt
    sqlldr login/pwd control=control.txt log=log.txt bad=bad.txt discard=discard.txt direct=y errors=2000000000> sqlldr.txt
    et mon fichier de control :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    LOAD DATA INFILE 'fic.dat'
    APPEND
    INTO TABLE MATABLE
    TRAILING NULLCOLS
    (
          ID POSITION  (1:10),
          QUANTITE POSITION (11:19) CHAR(9),
        CODE POSITION (20:40) CHAR "SUBSTR(:CODE ,1,3) || SUBSTR(:CODE ,4,1) || SUBSTR(:CODE ,5,10) || SUBSTR(:CODE ,21,1)"
    )

  2. #2
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut
    re

    j'ai creusé un peu plus, et je pense avoir trouvé une solution, mais elle me convient à moitié car je perds en performance.

    Voilou, donc d'après ce lien, on peut utiliser l'option REPLACE à la place d'APPEND dans le fichier de contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    LOAD DATA INFILE 'fic.dat'
    REPLACE
    INTO TABLE MATABLE
    TRAILING NULLCOLS
    (
    ID POSITION (1:10),
    QUANTITE POSITION (11:19) CHAR(9),
    CODE POSITION (20:40) CHAR "SUBSTR(:CODE ,1,3) || SUBSTR(:CODE ,4,1) || SUBSTR(:CODE ,5,10) || SUBSTR(:CODE ,21,1)"
    )
    Cette option marche correctement si le mode direct=n
    Hors dans mon cas le mode direct=y

    Quand ce mode est activité, ça booste bien, par contre j'ai une erreur si jamais je recharge les mêmes données :
    SQL*Loader-926: OCI error while executing delete/truncate (due to REPLACE/TRUNCATE keyword) for table MATABLE
    ORA-01502: index 'SCHEMA.INDEXPK' or partition of such index is in unusable state
    Si je refais ce test avec direct=y et après avoir fait un truncate de ma table au préalable, ca marche nickel, par contre, je suis beaucoup moins performant, et cela me pose problème

    Est-ce que quelqu'un aurait une idée pour utiliser le replace et que cela reste performant ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2007, 09h01
  2. sql loader-fichier de données trop important
    Par lg_gaelle dans le forum Oracle
    Réponses: 2
    Dernier message: 12/10/2006, 18h13
  3. SQL*Loader : filtrer les données chargées
    Par gattaca dans le forum Oracle
    Réponses: 2
    Dernier message: 13/07/2006, 09h51
  4. SQL LOADER : Coversion de données
    Par madina dans le forum SQL*Loader
    Réponses: 3
    Dernier message: 14/06/2006, 11h49
  5. SQL LOADER : erreur de données
    Par madina dans le forum SQL*Loader
    Réponses: 10
    Dernier message: 13/06/2006, 18h34

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