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

PL/SQL Oracle Discussion :

Problème de traitement de données après chargement dans une table temporaire


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Problème de traitement de données après chargement dans une table temporaire
    Bonjour,

    Des données sont chargées dans les colonnes d'une table temporaire depuis une table externe. Certains traitements sont à effectuer sur certaines colonnes avant chargement dans la table cible définitive.

    Je souhaiterais savoir comment implémenter le tout.
    Le chargement table externe vers table temporaire est ok!
    Simplement je souhaite savoir si je dois:
    1/ Effectuer les calculs (=traitements) sur les colonnes une fois que les données sont chargées dans la table temporaire ?
    2/ Ou alors dois-je implémenter les calculs à effectuer sur les colonnes en même temps qu'elles sont chargées depuis la table externe ?

    J'ai essayé de faire le traitement après chargement mais le programme ne semble pas aimer. Voilà la structure de mon code :

    1/ Chargement dans table temporaire depuis la table externe:
    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
     
     BEGIN
              IF is_INDICES THEN
                    EXECUTE IMMEDIATE '
                    INSERT INTO toto_temp 
              (
                        key_id,
                        evaluation_date,
                         ... etc...
                        event_type,
                        event_amount,
                        terms,
                        termsdate,
                        status     
                   )
                    SELECT
                        keyidseq.NEXTVAL,
                         evaluation_date,
                         ... etc...
                        event_type,
                        event_amount,
                        terms,
                        termsdate,
                        status
                    FROM '||extTableName;    
             ELSE
                    EXECUTE IMMEDIATE '
                    INSERT INTO toto_temp                  
                   (
                        key_id,
                        evaluation_date,
                         ... etc...
                        event_type,
                        event_amount,
                        terms,
                        termsdate,
                        status 
                    )
                      SELECT 
                    keyidseq.NEXTVAL,
                         evaluation_date,
                        ... etc...
                        event_type,
                        event_amount,
                        terms,
                        termsdate,
                        status
                   FROM '||extTableName; 
              end if;
    Exception
    ...
    end;
    2/ Ma solution de traitement suivait ainsi dans la même procédure :

    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
     
    Begin 
       IF IS_NOT_INDICES THEN
          SELECT ecs.event_type INTO v_event_type FROM TOTO_TEMP ecs
         WHERE ecs.termsdate = ecs.evaluation_date;
          AND ecs.status = 'IMPLEMENTED';
     
            IF v_event_type IS NOT NULL THEN 
            SELECT REPLACE(regexp_substr(ecs.event_type, '[[:digit:]]{1}.[[:digit:]]* SPECIAL'),'SPECIAL','')
              INTO v_event_amount
              FROM TOTO_TEMP ecs
             WHERE ecs.termsdate = ecs.evaluation_date
               AND ecs.status = 'IMPLEMENTED';
             END IF;
     
            IF v_event_amount IS NOT NULL 
            THEN
             UPDATE toto_temp  SET 
                   special_div_in_prov_currency =  v_event_amount;  
           END IF;
    Mais cela ne fonctionne pas.
    J'ai eu alors dans l'idée d'implémenter ces traitements directement sur les colonnes durant le processus de chargement mais cela me semble lourd et surtout je ne saurais comment faire.

    J'ai donc nesoin d'être guidée.

    Merci pour votre aide.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    L’idée d’utiliser une table de travail en plus de la table externe est très probablement erronée.
    Utiliser votre table externe comme une table normale et dites nous qu’est-ce que vous voulez faire avec vos données. Avec un exemple concret SVP.
    Sinon insert into provoque une exception NO_DATA_FOUND quand aucun enregistrement ne corresponde aux critères de sélection.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Pb de traitement de données après chargement dans une table
    Bonjour Mnitu et merci pour votre réponse,

    Simplement, l'environnement telle que décrite est implémenté de la sorte.
    Les données sont chargées depuis des fichier CSV dans des tables externes à partir desquelles elles sont chargées dans une table de travail temporaire. Et la table temporaire à son tour charge la table de travail définitive après différents traitements.
    A mon niveau, je dois faire des traitements sur des données au moment où elles sont insérées dans la table temporaire avant que le traitement général ne les insère dans la table cible définitive.
    Un fois la table temporaire rensignée, et avant qu'elle ne soit droppée, je dois :
    1/ extraire des montants à calculer depuis certaines colonnes de la table temporaire,
    2/ faire des calculs sur ces montants (appliquer des taux de change)
    3/ et ensuite renseigner 3 colonnes de cette même table par un update avec le résultat des calculs avant qu'elles n'aillent vers la table de destination.

    J'espère que mes explications sont assez claires.

    Merci pour votre aide.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Problème de traitement de données après chargement dans une table
    Par rapport à mon code précédent, suis-je sur la bonne voie en faisant un select ... into ... from ma table temporaire ?
    Dois-je intégrer une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Begin Loop ... end loop; EXCEPTION END;
    pour la lecture et le traitement des données depuis la table temporaire ?


    Merci d'avance.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Traitement de données après chargement dans une table temporaire
    Bonjour,

    Une fois que ma table temporaire EQUITY_TMP est chargée,
    Je lance le traitement 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
     
     
      Begin
     
      IF IS_INDICES 
      THEN
        FOR C IN (SELECT ecs.event_amount into v_event_amount 
                           from toto_tmp ecs
                        WHERE ecs.termsdate = ecs.evaluation_date
                            AND ecs.status = 'IMPLEMENTED'
                            AND ecs.event_amount is not null) 
         LOOP
     
                 IF v_event_amount IS NOT NULL 
                 THEN 
                    SELECT REPLACE(regexp_substr(ecs.event_amount, '[[:digit:]]{1}.[[:digit:]]* SPECIAL'),'SPECIAL','')
                     INTO v_event_amount
                     FROM toto_tmp ecs
                     WHERE ecs.termsdate = ecs.evaluation_date
                     AND ecs.status = 'IMPLEMENTED';
                   END IF;
     
                  IF v_event_amount IS NOT NULL THEN 
                  UPDATE toto_tmp ecs  SET 
                  special_div =  v_event_amount;
     
          END IF;              
     END LOOP;
    Simplement, le taritement de l’UPDATE ne se fait pas.
    Comment faire en sorte que cela fonctionne ?

    Merci pour votre aide.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Ca depend de comment vous creez votre table temporaire peut-etre.

    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
    TMP@minilhc >drop table tmp;
     
    Table dropped.
     
    TMP@minilhc >create global temporary table tmp (n number);
     
    Table created.
     
    TMP@minilhc >insert into tmp select level from dual connect by level<11;
     
    10 rows created.
     
     
    TMP@minilhc >select * from tmp;
     
             N
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
     
    10 rows selected.
     
    TMP@minilhc >commit;
     
    Commit complete.
     
    TMP@minilhc >select * from tmp;
     
    no rows selected
    Et le comportement pas par defaut:
    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
     
    TMP@minilhc >drop table tmp;
     
    Table dropped.
     
    TMP@minilhc >create global temporary table tmp (n number) on commit preserve rows;
     
    Table created.
     
    TMP@minilhc >insert into tmp select level from dual connect by level<11;
     
    10 rows created.
     
    TMP@minilhc >commit;
     
    Commit complete.
     
    TMP@minilhc >select * from tmp;
     
             N
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
     
    10 rows selected.
     
    TMP@minilhc >truncate table tmp;
     
    Table truncated.
     
    TMP@minilhc >drop table tmp;
     
    Table dropped.
    Je dis pas que c'est ca, mais ca peut-etre une erreur bete a laquelle on ne fait pas attention lors de la creation de la table.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/08/2011, 11h03
  2. [OpenOffice][Base de données] Récupérer les données aprés sélection dans une combobox
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/02/2009, 09h27
  3. Réponses: 2
    Dernier message: 28/10/2007, 17h46
  4. Réponses: 2
    Dernier message: 20/04/2007, 10h24
  5. [VBA-E]Transfere des données d'Excel dans une table Access
    Par flo83 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/04/2006, 09h22

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