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 Oracle Discussion :

sql*loader clause or ?


Sujet :

SQL Oracle

  1. #1
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut sql*loader clause or ?
    Bonjour a tous,

    dans un fichier de control sql loader j'ai besoin d'une double clause
    malheureuselment ce fichier de control ne passe pas et a priori a cause de la clause 'OR'. en effet si on la remplace par un AND (s'est C.. c'est vrai) ça marche

    Quel est la syntaxe pour ce genre de clause (a priori) simple

    Merci pour votre aide

    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
    18
    LOAD DATA
    INFILE 'toto.txt'					
     
    INSERT							
     
    INTO 	TABLE T1	
    	WHEN 	C_STT ='3' 
    	OR C_STT ='9'
     
    	FIELDS	terminated by "|"			
    	TRAILING NULLCOLS				
    (
    	C_code,				
    	C_code2,				
    	C_type,		
    	C_STT, 						MAJ_USER "'SQL LOADER'",			
    	D_MAJ "sysdate"  				
    )

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Merci de penser aux balises CODE à l'avenir

    Avez vous lu cet article : http://jaouad.developpez.com/sqlldr/ ?

  3. #3
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    Désolé pour l'oubli des balises

    Oui, je l'ai parcouru et je n'y ai pas trouver la notion de 'OR'
    Je pense quand même qu'elle existe pour le SQL loader

    ps : j'ai essayé les différentes combinaisons de parentheses mais rien n'y fait.

    l'erreur renvoyée est :
    Expecting "(", found "or".
    WHEN (C_STT ='3') or (C_STT ='9')
    je pense que la solution va me paraitre couillonne mais bon ...

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et avec un IN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN    C_STT IN ('3','9')

  5. #5
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    j'ai bien essayé ça aussi mais cela genere une erreur :

    Expecting = or "<>", found "in".
    WHEN C_STT in ('3','9')
    Merci si tu a d'autres idées n'hésite pas

    Pourtant cela devrait etre si simple ...

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Tu as fait une erreur au niveau de la condition WHERE en écrivant WHEN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE T1  WHERE  C_STT IN ('3','9');
    En espérant t'avoir aidé.

  7. #7
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    merci fdraven,

    mais c'est when que l'on utilise en SQL LOADER
    car le where ne passe pas ...

    Doit on en conclure que ce genre de double filtre ne peut pas marcher
    sous cette forme ? Peut etre du fait que c'est un fichier que l'on lit ?

    Je continu a tester , si quelqu'un a l'info, merci d'avance.

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Doc oracle
    A WHEN clause can contain several comparisons, provided each is preceded by AND.
    Il semble donc qu'il ne soit pas possible d'utiliser or.

    Par ailleurs, on ne peut (sauf erreur de ma part) utiliser que des opérateurs simples (= <>), le in n'étant pas possible.

    La solution que je te propose est de faire quelque chose comme cela :
    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
    LOAD DATA INFILE 'toto.txt'
    INSERT
    INTO TABLE T1 
    WHEN  (C_STT ='3' )
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
    (  
    ...
    )  
    INTO TABLE T1 
    WHEN (CTT='9')
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
    (   
    ...
    )
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    La solution est bonne, Merci !!!

    Dommage, un or allegeait bien le code mais bon.

    Encore merci

    Comment met-on un
    résolu
    dans le titre ?

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il y a des boutons en bas à gauche

  11. #11
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Hier je me suis emporté lorsque le traitement c'est mis a passé j'ai tout de suite considéré que le pb était résolu.
    Que nenni seul les enregistreement entrants dans le premier filtre
    ont été alimentés !!!

    Donc le probleme est toujours en cours.

    Pour l'instant J'ai détourné le probleme en positionnant des filtres
    dans les PROC qui viennent apres.

    Mais je cherche toujours a comprendre comment faire pour appliqué deux clause possible dans un SQL loader :

    En tout cas merci a vous tous pour votre aide

    je refais des tests et vous tient au courant.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Un truc un peu farfelu : tu fais le CTL avec AND, de sorte à rejeter tous les enregistrements que tu souhaites en fait charger.

    Et ensuite tu charges le fichier de rejet avec le même CTL sans la clause WHEN.

    Je vous avais prévenu, c'est farfelu

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    un trigger serait bien mieux

  14. #14
    fhy
    fhy est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    sebduth,

    c'est sioux !!! mais ça marcherais en mettant des and sur toutes les autres possibilité (or 9 et 3). Mais j'ai une solution plus simple avec 1 filtre apres dans la procedure stockée.

    Fred_D, un trigger?, eliminant le trop perçu?
    Pourquoi pas.


    En fait une solution j'en ai une, mais j'aimerai savoir pourquoi il n'est pas possible je gérer 2 possibilités dans le fichier de control (curiosité malsaine) :

    en tout cas merci de vous décarcasser

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    A mon avis cela ne fonctionne pas c'est parce que tu as la clause insert (insertion de données dans une table vide). Si tu essaies avec apend (ajout de données dans une table) cela devrait fonctionner. Si tu as besoin que la table soit vide essaie le truncate. Pour plus d'infos sur ces options :
    http://jaouad.developpez.com/sqlldr/#LIII-C
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    J'ai exactement le même souci mais il semble que cela ne fonctionne que dans le cas ou les champs sont en position fixe.

    je m'explique :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    create table test2(a number, b number);
     
    test22.ctl
     
    options (SILENT=(HEADER, FEEDBACK),errors=1,rows=10000)
    LOAD DATA APPEND
    Into table test2 
    When A='1' 
    (	A POSITION(1:1),
    	B POSITION(3:3)
    )
    Into table test2 
    When A='2' 
    (
    	A POSITION(1:1),
    	B POSITION(3:3)
    )
     
    test2.ctl
     
    options (SILENT=(HEADER, FEEDBACK),errors=1,rows=10000)
    LOAD DATA APPEND
    Into table test2 
    When A = '1' 
    FIELDS TERMINATED BY '|' 
    (
    	A ,
    	B 
    )
    Into table test2 
    When A = '2'
    FIELDS TERMINATED BY '|' 
    (
    	A ,
    	B 
    )
     
     
    test2.dat
     
    1|5
    2|6
    3|7
    1|8

    avec le premier ctl j'ai bien 3 ligne dans ma table

    avec le deuxieme je n'en ai que 2

    il semble donc que dans le cas d'un fichier avec séparateurs cette options ne fonctionne pas comme attendu .


    Si je me trompe je serai heureux qu'on me corrige.


    Edit : je viens de me rendre compte que je viens de remonter un topic vieux d'il y a quelques années, je suis désolé

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

Discussions similaires

  1. SQL*LOADER Clause when comparaison date
    Par maryline999 dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 07/03/2013, 10h07
  2. SQL Loader + CSV (sans noms de colonne) + clause WHEN
    Par surfman dans le forum SQL*Loader
    Réponses: 5
    Dernier message: 10/09/2009, 14h15
  3. Réponses: 4
    Dernier message: 19/06/2007, 17h51
  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