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 :

SqlLoader et clause WHEN


Sujet :

SQL*Loader Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut SqlLoader et clause WHEN
    Bonjour,

    Voici mon cas.

    Je reçois un fichier contenant des données de produits de la forme suivente (je simplifie le fichier et ma table pour que ce soit + lisible car le fichier a normalement 35 champs et la table 44 champs).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code produit|nom produit|type de colis|longueur|largeur|
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ABC|blabla|1|15|21|
    ABC|blabla|2|17|13|
    ABC|blabla|3|5|11|
    PLO|plouplouf|1|40|54|
    PLO|plouplouf|2|38|48|
    PLO|plouplouf|3|42|59|
    Voici un tableau qui permet de mieux visualiser les données (sachant que ce n'est qu'une représentation, pas une table de travail) :



    Voici la table que je souhaite remplir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TABLE_PRODUITS (
    	DAT_TRAIT	timestamp  NOT NULL,   
    	PRO_CODE	varchar2(17) NOT NULL,
    	PRO_LIB	  varchar2(70),
    	LENGTH_1 number(12,3),
    	LENGTH_2 number(12,3),
    	LENGTH_3 number(12,3),
    	WIDTH_1	number(12,3),
    	WIDTH_2	number(12,3),
    	WIDTH_3	number(12,3)
    )
    NB : DAT_TRAIT est rempli par un trigger qui avant chaque INSERT dans la table insère "systimestamp".

    Et le résultat que je souhaite obtenir (1 seule ligne par produit) :



    J'ai donc écrit le fichier de contrôle suivant :

    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
    LOAD DATA
    INFILE '/my_data.dat'
    BADFILE '/my_data.bad'
    APPEND
    PRESERVE BLANKS  
     
    -- COLIS 1
    INTO TABLE TABLE_PRODUITS
    when TYPE_COLIS = '1' 
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
     (
    	PRO_CODE "upper(trim(:PRO_CODE))",
    	PRO_LIB "upper(trim(:PRO_LIB))", 
    	TYPE_COLIS FILLER,
    	LENGTH_1 nullif LENGTH_1='0' "replace(:LENGTH_1, ',', '.')", 
    	WIDTH_1 nullif WIDTH_1='0' "replace(:WIDTH_1, ',', '.')"
    )
     
    -- COLIS 2
    INTO TABLE TABLE_PRODUITS
    when TYPE_COLIS = '2' 
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
     (
     	PRO_CODE "upper(trim(:PRO_CODE))",
    	PRO_LIB "upper(trim(:PRO_LIB))", 
    	TYPE_COLIS FILLER,
    	LENGTH_2 nullif LENGTH_2='0' "replace(:LENGTH_2, ',', '.')", 
    	WIDTH_2 nullif WIDTH_2='0' "replace(:WIDTH_2, ',', '.')"
    )
     
    -- COLIS 3
    INTO TABLE TABLE_PRODUITS
    when TYPE_COLIS = '3' 
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
     (
     	PRO_CODE "upper(trim(:PRO_CODE))",
    	PRO_LIB "upper(trim(:PRO_LIB))", 
    	TYPE_COLIS FILLER,
    	LENGTH_3 nullif LENGTH_3='0' "replace(:LENGTH_3, ',', '.')", 
    	WIDTH_3 nullif WIDTH_3='0' "replace(:WIDTH_3, ',', '.')"
    )

    Actuellement avec ce fichier de contrôle j'obtiens cela :


    Je sais qu'il faut utiliser "POSITION(x:y)" pour que SQL Loader reparcoure les enregistrements depuis le début.
    J'ai donc ajouté POSITION(1:3)au champ PRO_CODE comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRO_CODE POSITION(1:3) "upper(trim(:PRO_CODE))" ,

    Mais cela n'a rien changé.

    Par divers tests sur des tables d'exemple (voir ce topic) j'ai cru comprendre qu'il fallait que le POSITION(x:y) concerne le champ de la clause WHEN.
    Déjà, est ce que cette constatation est vraie ?

    Si oui, je ne peux pas mettre "POSITION(x:y)" au champ TYPE_COLIS car certains champs précédant TYPE_COLIS (notamment PRO_LIB) sont de longueur variable !

    J'ai donc penser à ajouter une clause au when comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    when TYPE_COLIS = '3' 
    and PRO_CODE <> '000000' -- (ou PRO_CODE not null, je ne sais pas la syntaxe)
    Mais j'ai testé, cela ne fonctionne pas mieux, j'obtiens toujours le même résultat.
    Dans les logs, je vois que SQLLoader plante sur un champ que je ne vous ai pas mis (ORA-01401: inserted value too large for column) alors que la colonne est un varchar2(3) et qua la valeur à insérer est "01"...
    C'est idem en mettant la clause sur le PRO_CODE en premier ..

    Est-ce que qqun pourrait m'aider ?

    D'avance merci !

  2. #2
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    J'essaierais avec une table externe plutot que SQL*Loader. Ce serait bien plus simple.

    Nicolas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci NGasparotto mais je n'ai pas le choix..
    SQL*Loader m'a été imposé.. Et ce filtre à ajouter est récent, aussi il est trop tard maintenant pour changer de technologie

  4. #4
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Si on peut aisement inserer dans differentes tables avec la clause WHEN, je ne suis pas si sur que ce que tu veux faire est possible, inserer differentes lignes du fichier dans une seule ligne.
    En fait, sur la deuxieme ligne du fichier tu veux faire un update d'une ligne existante, meme chose sur la troisieme...
    Pourquoi ne pas avoir une table intermediaire ? Tu pourrais alors utiliser SQL*Loader, puis un insert depuis cette table dans la table cible bien plus facilement.
    Je ne comprends pas que SQL*Loader soit impose alors qu'une solution bien plus simple existe. D'autant qu'une table externe utilise les meme techno que SQL*Loader.

    Nicolas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Le problème c'est que les DBA n'ont pas été suffisamment concertés pour le choix de la solution technique, et comme au départ il fallait juste filtrer par numéro de colis, SQL*Loader convenait très bien .. Mais ce n'est plus le cas maintenant (le fichier de données a été modifié ) ..

    Tant pis je vais passer par 1 table intermédiaire, charger tout par SQL*Loader puis créer une procédure stockée pour faire ces chargements..
    Ce qui m'embête c'est que ça va faire 2 procédure stockées et c'est beaucoup moins facile de surveiller une procédure stockée que SQL*Loader en terme d'exploitation

  6. #6
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Bon, apres une petite recherche dans la doc, il semble que ce soit possible avec l'usage de CONTINUEIF.
    Dans ton cas, une nouvelle ligne sera determinee par "type de colis"=1
    Ca semble relativement simple, le nombre de caractere ne repart pas a 0 a chaque ligne mais uniquement quant "type de colis"=1 (definie dans CONTINUEIF).
    Tu peux voir un exemple - DEMO 4 - dans le lien ci-dessous :
    http://www.psoug.org/reference/sqlloader.html

    Maintenant a toi de jouer.

    Bon courage,

    Nicolas.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Oooooh merciiiiiiiiiiiii
    Je teste ça lundi, mille mercis Nicolas (il manque un smilet qui fait un bisou )

  8. #8
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par babylone7 Voir le message
    Oooooh merciiiiiiiiiiiii
    Je teste ça lundi, mille mercis Nicolas (il manque un smilet qui fait un bisou )
    Bon, si c'est pour un bisous, alors c'est pour la bonne cause.

    En fait, on ne peut pas utiliser CONTINUEIF parceque tu n'as pas une longueur fixe des champs.
    Un autre parametre fait exactement ce que tu veux, CONCATENATE.
    Je ne le connaissais pas (et ca peut toujours servir), alors j'ai teste et voila l'exemple a partir de tes donnees :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    E:\Scripts\Sql>sqlplus scott/demo111
     
    SQL*Plus: Release 11.1.0.7.0 - Production on Fri Jun 26 18:17:26 2009
     
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
     
     
    Connected to:
    Personal Oracle Database 11g Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    SQL> create table TABLE_PRODUITS (
      2     DAT_TRAIT       timestamp  NOT NULL,
      3     PRO_CODE        varchar2(17) NOT NULL,
      4     PRO_LIB   varchar2(70),
      5     LENGTH_1 number(12,3),
      6     LENGTH_2 number(12,3),
      7     LENGTH_3 number(12,3),
      8     WIDTH_1 number(12,3),
      9     WIDTH_2 number(12,3),
     10     WIDTH_3 number(12,3)
     11  );
     
    Table created.
     
    SQL> create trigger TABLE_PRODUITS_TRG
      2  before insert on TABLE_PRODUITS
      3  for each row
      4  begin
      5  :new.DAT_TRAIT:=systimestamp;
      6  end;
      7  /
     
    Trigger created.
     
    SQL>
    SQL> quit
    Disconnected from Personal Oracle Database 11g Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    E:\Scripts\Sql>type babylone7_file.txt
    ABC|blabla|1|15|21|
    ABC|blabla|2|17|13|
    ABC|blabla|3|5|11|
    PLO|plouplouf|1|40|54|
    PLO|plouplouf|2|38|48|
    PLO|plouplouf|3|42|59|
     
    E:\Scripts\Sql>type babylone7_file.ctl
    load data
    infile 'babylone7_file.txt'
    badfile 'babylone7_file.bad'
    concatenate 3
    into table TABLE_PRODUITS
    FIELDS TERMINATED BY '|'
    (PRO_CODE,
     PRO_LIB,
     type_colis  filler,
     LENGTH_1,
     WIDTH_1,
     PRO_CODE2   filler,
     PRO_LIB2    filler,
     type_colis2 filler,
     LENGTH_2,
     WIDTH_2,
     PRO_CODE3   filler,
     PRO_LIB3    filler,
     type_colis3 filler,
     LENGTH_3,
     WIDTH_3)
     
    E:\Scripts\Sql>sqlldr userid=scott/demo111 control=babylone7_file.ctl
     
    SQL*Loader: Release 11.1.0.7.0 - Production on Fri Jun 26 18:18:18 2009
     
    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
     
    Commit point reached - logical record count 1
    Commit point reached - logical record count 2
     
    E:\Scripts\Sql>sqlplus scott/demo111
     
    SQL*Plus: Release 11.1.0.7.0 - Production on Fri Jun 26 18:18:21 2009
     
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
     
     
    Connected to:
    Personal Oracle Database 11g Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> set lines 150
    SQL> select * from TABLE_PRODUITS;
     
    DAT_TRAIT                       PRO_CODE PRO_LIB     LENGTH_1   LENGTH_2   LENGTH_3    WIDTH_1    WIDTH_2    WIDTH_3
    ------------------------------- -------- ----------- ---------- ---------- ---------- ---------- ---------- ----------
    26-JUN-09 06.18.18.390000 PM    ABC      blabla              15         17          5         21         13         11
    26-JUN-09 06.18.18.453000 PM    PLO      plouplouf           40         38         42         54         48         59
     
     
    SQL>
    Alors, biensur, ca implique :
    1. que ton fichier est ordonne, les lignes avec un meme PRO_CODE doivent se suivre
    2. que ton fichier est ordonne, "type_colis" doit etre d'abord 1, puis 2 sur la deuxieme ligne et enfin 3 sur la troisieme ligne (par rapport aux colonnes que tu veux remplir).
    Peut-etre y-a-t'il des solutions pour s'affranchir d'une de ces contraintes, mais la je pense en avoir fais assez pour le moment


    Nicolas.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci Nicolas !!
    Bon j'ai fait quelques tests pas concluants pour le moment, mais je vais regarder + en détails, j'ai pas eu assez de temps ce matin !

    Concernant les contraintes !

    1. que ton fichier est ordonne, les lignes avec un meme PRO_CODE doivent se suivre
    --> ça c'est ok
    2. que ton fichier est ordonne, "type_colis" doit etre d'abord 1, puis 2 sur la deuxieme ligne et enfin 3 sur la troisieme ligne (par rapport aux colonnes que tu veux remplir).
    --> je ne sais pas si c'est ok car j'ai un filtre en + que je n'ai pas précisé dans mon exemple.
    Dans chaque colis, j'ai un type de ligne et je ne veux que certains types de lignes,par exemple je ne souhaite que la ligne 1..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ABC|blabla|1|ligne1|15|21|
    ABC|blabla|1|ligne2|12|30|
    ABC|blabla|1|ligne3|7|4|
    ABC|blabla|2|ligne1|17|13|
    ABC|blabla|2|ligne2|20|17|
    ABC|blabla|3|ligne1|5|11|
    PLO|plouplouf|1|ligne1|40|54|
    PLO|plouplouf|2|ligne1|38|48|
    PLO|plouplouf|3|ligne1|42|59|
    Je continue à étudier la chose

    Merci bcp bcp pour ton aide

  10. #10
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Aie, alors ca se complique encore. Peut-etre vaut-il mieux passer par une table intermediaire alors, ou encore une fois, external table serait l'ideal.
    A moins que tu ne supprime en amont les lignes non desirees dans le fichier (!='ligne1') avec sed ou awk (ca, ca doit etre facile)... et tant qu'a faire du sed et/ou awk, tu peux meme concatener les lignes (ca, c'est peut-etre un peu plus difficile).

    Nicolas.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Oui, mon fichier est plus compliqué que ce que j'ai donné, mais par souci de confidentialité, je ne pouvais pas tout mettre..
    Peut-être pourrais-je t'envoyer mon fichier complet par mp ?

  12. #12
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Je comprends la confidentialite des infos contenues dans le fichier.
    Cependant, dans un soucis de partage sur le forum, il serait bien mieux si tu pouvais fournir un fichier "bidon" respectant les contraintes du fichier reel.

    Nicolas.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Oui tu as raison !

    Je m'y mets tout de suite

  14. #14
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Cool, tant qu'a faire et pour etre complet, tu pourras donner ta version d'Oracle (complete, de la forme 10.2.0.4 par ex.) et ton OS (complet, nom et version de la forme AIX5.3 par ex.).

    Nicolas.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Voila donc un fichier "bidon" reprenant toutes les infos de mon fichier original.

    colonnes : CODE PRODUIT|LIBELLÉ PRODUIT|AUTRE CODE PRODUIT|CODE FAMILLE DU PRODUIT|LANGUE DE LA DESCRIPTION|DESCRIPTION|COMMENTAIRES|AUTRE DESCRIPTION|CODE COULEUR|LIBELLÉ COULEUR|CODE TAILLE|LIBELLÉ TAILLE|ean |CODE FOURNISSEUR|PAYS ORIGINE|NOM FOURNISSEUR|RÉF DU PRODUIT CHEZ LE FOURNISSEUR|MINIMUM COMMANDE|NB JOURS DÉLAI PRODUCTION|ENTITE RESPONSABLE|INCOTERM|CODE PAYS ET VILLE|PRIX ACHAT|DEVISE|CODE FILIALE|num_colis|UNITÉ LOGISTIQUE|PCB|NB ul|LONGUEUR|LARGEUR|HAUTEUR|VOLUME|POIDS BRUT|POIDS NET|

    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
     
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|INN|0||||||||
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|MAS|10|0|10|10|10|100|10|8|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PAL|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PCE|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PSP|0|0|100|100|100|1|0|0|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|INN|0||||||||
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|MAS|10|0|10|10|10|100|10|9|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PAL|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PCE|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345601|01|ANG|NUL|||DP BLK|DEEP BLACK|XS| VERY SMALL SIZE|1234567891011|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PSP|0|0|100|100|100|1|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|INN|0||||||||
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|MAS|10|0|10|10|10|100|10|8|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PAL|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PCE|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|ES|2|PSP|0|0|100|100|100|1|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|INN|0||||||||
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|MAS|10|0|10|10|10|100|10|9|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PAL|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PCE|0|0|0|0|0|0|0|0|
    123456|JUPE A CARREAUX|12345602|01|ANG|NUL|||LGT GRN|LIGHT GREEN|XXL| VERY VERY LARGE SIZE|1234567898765|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PSP|0|0|100|100|100|1|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|INN|0||||||||
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|MAS|10|0|10|10|10|100|2|1|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PAL|0|0|0|0|0|0|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PCE|0|0|0|0|0|0|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||10|15|PAR|EXW|FRANR|10000|EUR|FR|1|PSP|0|0|100|100|100|1|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||11|15|PAR|EXW|FRANR|10000|EUR|ES|2|INN|0||||||||
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||11|15|PAR|EXW|FRANR|10000|EUR|ES|2|MAS|11|0|11|11|11|133|11|10|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||11|15|PAR|EXW|FRANR|10000|EUR|ES|2|PAL|0|0|0|0|0|0|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||11|15|PAR|EXW|FRANR|10000|EUR|ES|2|PCE|0|0|0|0|0|0|0|0|
    456789|JUPE A CARREAUX|45678901|01|ANG|NUL|||S BL|SEA BLUE|M| MEDIUM SIZE|4567891011121|SUPPLIER1|FR|SUPPLIER NUMBER1||11|15|PAR|EXW|FRANR|10000|EUR|ES|2|PSP|0|0|100|100|100|1|0|0|
    Les lignes à éliminer sont les lignes don l'unité logistique est INN ou PSP.
    Et ensuite je voudrais une ligne par produit avec toutes les longueurs, puis toutes les largeurs, puis toutes les hauteurs, puis tous les volumes, puis tous les poids bruts, puis tous les poids nets.
    Avec deux sed à la suite (peut-on n'en faire qu'un seul d'ailleurs ?) ça élimine bien les lignes INN et PSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sed '/|INN|/d'  fichier.dat > fichier1.dat
    sed '/|PSP|/d'  fichier1.dat > fichier2.dat
    Est-ce que le CONCATENATE va pouvoir s'appliquer avec un tel format de fichier ?

    Merci !

    ---------
    Version d'Oracle : 9i Enterprise Edition Release 9.2.0.7.0
    OS : AIX 5.3.0.0

  16. #16
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Je reste convaincu qu'une table externe solutionnerait ton probleme bien plus facilement que n'importe quel shell sed/awk+sqlldr
    Si tu n'en ai toujours pas convaincu, regardes, a partitr du fuchier que tu as donne (pas bien sur si tu peux avoir un meme num_colis pour un code_produit donne) :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    SQL> create table table_produit_ext
      2  (CODE_PRODUIT number,
      3   LIBELLE_PRODUIT varchar2(50),
      4   AUTRE_CODE_PRODUIT number,
      5   CODE_FAMILLE_PRODUIT number,
      6   LANGUE varchar2(3),
      7   DESCRIPTION varchar2(100),
      8   COMMENTAIRES varchar2(100),
      9   AUTRE_DESCRIPTION varchar2(100),
     10   CODE_COULEUR varchar2(100),
     11   LIBELLE_COULEUR varchar2(100),
     12   CODE_TAILLE varchar2(10),
     13   LIBELLE_TAILLE varchar2(100),
     14   ean number,
     15   CODE_FOURNISSEUR varchar2(100),
     16   PAYS_ORIGINE varchar2(100),
     17   NOM_FOURNISSEUR varchar2(100),
     18   REF_PRODUIT_FOURNISSEUR varchar2(100),
     19   MINIMUM_COMMANDE number,
     20   NB_JOURS_PRODUCTION number,
     21   ENTITE_RESPONSABLE varchar2(100),
     22   INCOTERM varchar2(100),
     23   CODE_PAYS_VILLE varchar2(100),
     24   PRIX_ACHAT number,
     25   DEVISE varchar2(3),
     26   CODE_FILIALE varchar2(20),
     27   num_colis number,
     28   UNITE_LOGISTIQUE varchar2(10),
     29   PCB number,
     30   NB_ul number,
     31   LONGUEUR number,
     32   LARGEUR number,
     33   HAUTEUR number,
     34   VOLUME number,
     35   POIDS_BRUT number,
     36   POIDS_NET number)
     37  organization external
     38  (type oracle_loader
     39   default directory DATA_PUMP_DIR
     40   access parameters
     41   (records delimited by newline
     42    badfile 'babylone7_file.bad'
     43    logfile 'babylone7_file.log'
     44    fields terminated by "|"
     45    (CODE_PRODUIT integer external (20),
     46     LIBELLE_PRODUIT CHAR(50),
     47     AUTRE_CODE_PRODUIT integer external (20),
     48     CODE_FAMILLE_PRODUIT integer external (20),
     49     LANGUE CHAR(3),
     50     DESCRIPTION CHAR(100),
     51     COMMENTAIRES CHAR(100),
     52     AUTRE_DESCRIPTION CHAR(100),
     53     CODE_COULEUR CHAR(100),
     54     LIBELLE_COULEUR CHAR(100),
     55     CODE_TAILLE CHAR(10),
     56     LIBELLE_TAILLE CHAR(100),
     57     ean integer external (20),
     58     CODE_FOURNISSEUR CHAR(100),
     59     PAYS_ORIGINE CHAR(100),
     60     NOM_FOURNISSEUR CHAR(100),
     61     REF_PRODUIT_FOURNISSEUR CHAR(100),
     62     MINIMUM_COMMANDE integer external (20),
     63     NB_JOURS_PRODUCTION integer external (20),
     64     ENTITE_RESPONSABLE CHAR(100),
     65     INCOTERM CHAR(100),
     66     CODE_PAYS_VILLE CHAR(100),
     67     PRIX_ACHAT integer external (20),
     68     DEVISE CHAR(3),
     69     CODE_FILIALE CHAR (20),
     70     num_colis integer external (20),
     71     UNITE_LOGISTIQUE CHAR(10),
     72     PCB integer external (20),
     73     NB_ul integer external (20),
     74     LONGUEUR integer external (20),
     75     LARGEUR integer external (20),
     76     HAUTEUR integer external (20),
     77     VOLUME integer external (20),
     78     POIDS_BRUT integer external (20),
     79     POIDS_NET integer external (20))
     80    )
     81  location ('babylone7_file.txt'))
     82  reject limit unlimited;
     
    Table created.
     
    SQL>
    SQL>
    SQL> select code_produit, UNITE_LOGISTIQUE, pcb,nb_ul,longueur,largeur,hauteur,volume,poids_brut,poids_net
      2  from   table_produit_ext
      3  where  num_colis=1
      4  and    UNITE_LOGISTIQUE not in ('INN','PSP');
     
    CODE_PRODUIT UNITE_LOGI        PCB      NB_UL   LONGUEUR    LARGEUR    HAUTEUR     VOLUME POIDS_BRUT  POIDS_NET
    ------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
          123456 MAS                10          0         10         10         10        100         10          9
          123456 PAL                 0          0          0          0          0          0          0          0
          123456 PCE                 0          0          0          0          0          0          0          0
          123456 MAS                10          0         10         10         10        100         10          9
          123456 PAL                 0          0          0          0          0          0          0          0
          123456 PCE                 0          0          0          0          0          0          0          0
          456789 MAS                10          0         10         10         10        100          2          1
          456789 PAL                 0          0          0          0          0          0          0          0
          456789 PCE                 0          0          0          0          0          0          0          0
     
    9 rows selected.
     
    SQL>
    Ensuite, il ne s'agit plus que de requete SQL pour ne selectionner que ce que tu veux, puis de faire un insert dans ta table cible.

    Nicolas.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci Nicolas,

    Dans ce cas, le script qui lançait sql loader lance ce sql de création ?
    Mais du coup je perds mes données à chaque fois ?

  18. #18
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    De quelles donnees parles-tu ?
    Il ne s'agit pas de travailler en permanence sur le fichier comme une table, mais d'une etape intermediaire qui peut te permettre de charger ta table cible bien plus facilement que ne l'aurait permis SQL*Loader.

    Nicolas.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Ah oui oui ça y est j'y suis, tu as raison !
    Je ne perdrai rien, j'ai compris !
    Je suis en train de faire des essais

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Me revoilà !

    Le chargement du fichier dans la table externe fonction très bien

    Maintenant j'ai des soucis pour remplir ma table cible..
    D'abord comment boucler ? Il me faut créer une procédure stockée ?
    Ensuite, j'ai peur que mes requêtes soient trop lourdes.. En effet, voila comment je compte procéder et je pense que ce n'est pas la bonne démarche ?

    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
     
    insert intoTABLE_CIBLE (PRO_REF, PRO_LIB, CAG_CODE, FAM_CODE, LAN_CODE, PRO_DESC, PRO_COM, COL_CODE, COL_NAME, SIZ_CODE, SIZ_NAME, EAN_CODE, SUP_CODE, SUP_COU, SUP_NAME, SUP_REF, PRO_MOQ, LEAD_TIME, LOC_CODE, INC_CODE, INP_CODE, UNT_PRC, CUR_CODE, CLT_CODE, PRO_PCB, SOU_PCB, LENGTH_PAL, LENGTH_MAS, LENGTH_PCE, WIDTH_PAL, WIDTH_MAS, WIDTH_PCE, HEIGHT_PAL, HEIGHT_MAS, HEIGHT_PCE, VOL_PAL, VOL_MAS, VOL_PCE,GROSS_WGT_PAL, GROSS_WGT_MAS, GROSS_WGT_PCE) 
    values (
    CODE_PRO_COURANT_DANS_LA_BOUCLE, 
    select libelle_produit from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE, 
    select autre_code_produit from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE, 
    [...], 
    select longueur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PAL', 
    select longueur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='MAS', 
    select longueur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PCE', 
    select largeur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PAL', 
    select largeur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='MAS', 
    select largeur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PCE', 
    select hauteur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PAL', 
    select hauteur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='MAS', 
    select hauteur from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PCE', 
    select volume from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PAL', 
    select volume from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='MAS', 
    select volume from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PCE', 
    select poids_brut from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PAL', 
    select poids_brut  from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='MAS', 
    select poids_brut  from table_produit_ext where code_produit = CODE_PRO_COURANT_DANS_LA_BOUCLE and num_colis=1 and unite_logistique='PCE'
    )

Discussions similaires

  1. SQLLOADER: appel à une autre table dans la clause when du CTL
    Par jamesleouf dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 28/03/2011, 09h29
  2. MERGE sans clause WHEN NOT MATCHED
    Par Patmane dans le forum Oracle
    Réponses: 7
    Dernier message: 29/04/2009, 17h02
  3. Réponses: 2
    Dernier message: 30/01/2008, 15h38
  4. Réponses: 4
    Dernier message: 19/06/2007, 17h51
  5. [SQLLOADER] probleme clause when
    Par piro dans le forum SQL
    Réponses: 10
    Dernier message: 08/02/2007, 17h23

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