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

Import/Export Oracle Discussion :

SQL Loader et sysdate-1


Sujet :

Import/Export Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut SQL Loader et sysdate-1
    Bonjour messieurs,

    Après recherche sur le forum et beaucoup de test, mon code reste toujours en erreur. Et pourtant je ne cherche qu'à inserer tout bettement la date du jour - 1 dans une colonne grace à SQL Loader.

    mon fichier de control initial ressemble à ça et cela fonctionne parfaitemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOAD DATA INFILE 'WhatsUp.csv' APPEND INTO TABLE Materiel FIELDS TERMINATED BY ';' (Identifiant, Dates SYSDATE, Type, Total_temps CONSTANT "320", Total_temps_service, Total_indisponibilite)
    Toutes les lignes devant etre inserer dans ma base le sont.

    Des que je mets sysdate-1 de cette maniere, cela ne fonctionne plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOAD DATA INFILE 'WhatsUp.csv' APPEND INTO TABLE Materiel FIELDS TERMINATED BY ';' (Identifiant, Dates SYSDATE-1, Type, Total_temps CONSTANT "320", Total_temps_service, Total_indisponibilite)
    J'ai donc essayer avec des conversion (to_char et to_date), des formats de dates différents. J'ai également remplacer mon sysdate-1 par:
    "(:SYSDATE-1, 'DD/MM/YYYY 24HH:MI)",
    "SELECT SYSDATE-1 FROM DUAL",
    etc...

    Mais rien ne fonctionne et je ne comprend vraiment pas pourquoi.
    Cela doit etre tout bete, mais je ne vois vraiment pas ou je peux me tromper.

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 30
    Points
    30
    Par défaut
    un exemple d'un ligne de donnée du fichier serai le bienvenue

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Pourquoi pas. bien que la date n'apparait pas dans le fichier.
    Les données sont de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID1;DESC1;450;0
    ID2;DESC2;420;30
    ID3;DESC3;450;0
    ID4;DESC4;440;10
    etc..

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Tu y étais presque, il suffit d'entourer la fonction par des doubles cotes:

    "SYSDATE-1"

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Non cela ne fonctionne pas, j'avais deja du essayer aussi.

    il ne me mets pas d'erreur lors de l'utilisation mais si par exemple j'ai 300 lignes à inserer, il me dis qu'il n'a inseré qu'une ligne et meme cette ligne la n'est pas visible.

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Après relecture de ton control file, le problème semble être situé sur les champs de ton fichier qui se décalent à cause de la colonne DATES absente du fichier.

    J'ai donc modifié ton fichier de controle de cette manière en décalant les champs explicitement et en ajoutant TRAILING NULLCOLS, en espérant que cela résolvera ton problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    LOAD DATA 
    INFILE 'WhatsUp.csv' 
    APPEND INTO 
    TABLE Materiel 
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (
    Identifiant,
    Dates "SYSDATE-1",
    Type ":Dates",
    Total_temps CONSTANT "320",
    Total_temps_service ":Type",
    Total_indisponibilite ":Total_temps_service")
    Un conseil en passant, évite d'utiliser un mot clé Oracle comme nom de colonne (TYPE).

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ok.
    Je test ca dès que possible et vous tiens au courant.

    PS: Merci pour le "TYPE" car j'ai deja eu des souci avec "DATE". A croire que ca m'a pas servi de leçon

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci Severn, ca marche niquel.
    Par contre une petite question. est ce que tu pourrai m'expliquer un peu plus en details la manip'.
    comme l'utilisation des ":" et pourquoi un decalage est visible dans le fichier de control?

    et est ce que je peux doublement abusé??
    Saurais-tu comment faire pour charger des données dans un ordre différent de celui de la base.

    par exemple une table avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champ1, champ2, champ3, etc..
    et mon fichier plat avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champàsuppr1, champàsuppr2, champ3, champàsuppr3, champ1, champ2, etc..
    Merci d'avance.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    C'est vrai que je n'ai pas fait simple en gardant bêtement l'ordre des colonnes. Le fichier de controle aurait pu être celui ci, beaucoup plus lisible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (
    Identifiant,
    Type,
    Total_temps_service,
    Total_indisponibilite,
    Dates "SYSDATE-1",
    Total_temps CONSTANT "320"
    )
    Pour répondre à ta deuxième question, les champs de ton fichier à omettre doivent associer à un "filler".
    Cela indique que le champ doit être sauté, il n'y aura donc pas de tentative d'association à une colonne de la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    champasuppr1 FILLER,
    champàsuppr2 FILLER,
    ...
    Quant à l'explication du fichier de controle, je vais tenter d'être clair:
    - Les colonnes de la table sont associées au champs du fichiers de manière itérative. L'alimentation de la table s'effectuant normalement par le nom de la colonne.
    - Lorsqu'une constante est utilisée pour une colonne, il y aura un décalage dans l'association entre colonnes et champs.
    - Lorsque une fonction est utilisée pour une colonne, il y aura subtitution par la fonction mais sans décalage des champs.
    - On utilise la syntaxe ":NomDeColonne" (comme une variable liée) pour choisir une colonne en lieu et place du champ associé. Il s'agit bien d'un nom de colonne et non pas d'un champ, ce qui permet d'utiliser le champ normalement associé à ce nom de colonne. C'est ce qui permet les inversions entre 2 colonnes. Cela permet également d'utiliser des fonctions avec cette variable (ex: "upper(substr(:NomDeColonne,3,1))" ).
    - Les Filler décalent l'association colonne-champs mais coté colonnes cette fois. Ce qui permet de sauter un champ du fichier.

    En prenant ton exemple, il y a des champs à sauter et des inversions dans l'alimentation.
    Il suffit simplement d'associer directement la bonne colonne au champ du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Fichier plat exemple:
    F1;F2;333;F3;111;222
    F1;F2;333;F3;111;222
    F1;F2;333;F3;111;222
     
    Description de la table:
    (champ1 number, champ2 number, champ3 number)
     
    Extrait du fichier de controle:
    (
    champasuppr1 filler,
    champasuppr2 filler,
    champ3,
    champasuppr3 filler,
    champ1,
    champ2
    )
    Mais si on liste les colonnes dans l'ordre de la table alors il faudra utiliser les variables pour alimenter correctement la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (
    champasuppr1 filler,
    champasuppr2 filler,
    champ1 ":champ2",
    champasuppr3 filler,
    champ2 ":champ3",
    champ3 ":champ1")

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Wow.
    Bah écoute, merci beaucoup pour toutes ces infos. Si il y avait un tag méga résolu, je le mettrai !!
    Je vais tester tout ca et te tiens au courant de l'avancement, mais je pense que ca devrait aller avec toutes ces infos.
    Encore merci

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bon bah ca fonctionne niquel. Sacré épine du pied que tu viens de m'enlever.
    Une dernière question, en espérant ne pas abusé (surtout vu comme la conversation a dévié depuis que j'ai ouvert le topic).

    Lors de mes tests, j'ai un problème récurent qui est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ORA-39776: fatal Direct Path API error loading table TABIPA.EXPLOIT
    ORA-26026: unique index TABIPA.SYS_C0027652 initially in unusable state
    SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
    Comme je n'ai pas les droits pour réparer les indexs, je suis obligé a chaque coup de droper ma table et de la recréé à l'identique. (je sais c'est lourd, mais le DBA n'est pas la et je ne peux pas faire autrement)

    Je me suis donc renseigné voir si je pouvais faire autrement et je suis tombé la dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Oracle Database Error Code ORA-26026 Description :
    unique index string.string initially in unusable state
     
    Error Cause:
    A unique index is in IU state (a unique index cannot have * index maintenance skipped via SKIP_UNUSABLE_INDEXES).
     
    Action:
    Either rebuild the index or index partition, or use * SKIP_INDEX_MAINTENANCE if the client is SQL*Loader.
    Seulement je ne vois pas ou le spécifier à SQL Loader.
    Peut tu m'aider (encore une fois )

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    D'après les messages que tu reçois, il semblerait que tu utilises sql*loader en mode direct.
    Le message d'erreur concerne un index de ta table. Son statut est Index Unusable (IU), inutilisable avant chargement donc il devra être reconstruit à l'issue du chargement. D'après le message ORA-26026, il faudrait utiliser le paramètre SKIP_UNUSABLE_INDEXES par sql*loader (valeur à TRUE) pour ne pas tenir compte de l'index si celui-ci n'était pas unique.
    Comme cet index est unique (clé primaire ?) et que l'opération ci-dessus n'est pas possible pour ce type d'index, il faudrait utiliser le paramètre SKIP_INDEX_MAINTENANCE (à TRUE) pour pouvoir faire le chargement.
    A tester donc.

    Je pense que tu dois avoir dans ton fichier des données qui ne satisfont pas la condition d'unicité de l'index. Le mieux serait de repèrer ces données et corriger le fichier, ou bien supprimer ton index et essayer de repérer dans la table des éventuelles entrées multiples.

  13. #13
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ok trouvé!
    Le souci venait bien du fait que j'ai des doublons dans ma table.

    Encore une fois merci pour tout ces renseignements. tout fonctionne ultra niquel.

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

Discussions similaires

  1. équivalent SQL*Loader pour FB / IB
    Par djeant dans le forum Outils
    Réponses: 9
    Dernier message: 10/01/2005, 21h26
  2. Chargement de fichier par SQL LOADER
    Par davy.g dans le forum SQL*Loader
    Réponses: 17
    Dernier message: 15/11/2004, 13h08
  3. SQL LOADER
    Par velo83 dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 25/10/2004, 08h24
  4. Réponses: 4
    Dernier message: 10/06/2004, 18h05
  5. erreur sql loader et performance
    Par mobisky dans le forum SQL*Loader
    Réponses: 14
    Dernier message: 20/08/2003, 12h27

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