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 :

parcourir des records et executer des requetes selon certaines valeurs?


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
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut parcourir des records et executer des requetes selon certaines valeurs?
    Bonjour,
    est-ce qu'il est possible de faire ce que je souhaite:

    1)selectionner les champs d'une table
    2)en fonction de certains critères de 2 colonnes de chacun des enregistrements précédent ; exécuter une requete SQL précise (update dans une autre table, update différents pour chaque cas).
    3)En cas d'erreur d'éxcution de ces requetes, exécuter une autre requete qui va logguer l'erreur (insert).
    4)En cas d'éxcution sans problème, mettre à jour l'enregistrement de la table que je parcours actuellement.


    J'espère que c'est clair :S
    Jme suis cassé les dents avec des case, des if et des exception, et la je sèche.
    C'est qqch de facile à faire si il y a un peu de programmation derrière, mais tout en sql oracle... c'est une autre histoire !


    P-e le schéma joint sera utile.

    Voici mon code, ca à l'air de marcher, mais est-ce que c'est une bonne façon de faire ?

    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
    --MAJ DES INFOS IMMEUBLES
    DECLARE 
    err_msg varchar2(128);
    BEGIN
    FOR r IN (SELECT bl_id from INT_I9_TEMP_BL WHERE INT_I9_TEMP_BL.bl_id IN ( SELECT bl_id from BL) and data_valid = 1 order by bl_id) 
    LOOP
     
    BEGIN
    --La totale
             UPDATE bl SET (CTRY_ID,site_id,city_id,address1,address2,zip,contact_phone,name,ril) = 
             (SELECT DISTINCT ctry_id,site_id,city_id,address1,address2,zip,contact_phone,bl_name,ril
             FROM INT_I9_TEMP_BL WHERE INT_I9_TEMP_BL.bl_id = r.bl_id and data_codeiso3 = 0 AND data_pole = 0);
    --Sans pays
              UPDATE bl SET (site_id,city_id,address1,address2,zip,contact_phone,name,ril) = 
             (SELECT DISTINCT site_id,city_id,address1,address2,zip,contact_phone,bl_name,ril
             FROM INT_I9_TEMP_BL WHERE INT_I9_TEMP_BL.bl_id = r.bl_id and data_codeiso3 = 1 AND data_pole = 0);
    --Sans site
              UPDATE bl SET (CTRY_ID,city_id,address1,address2,zip,contact_phone,name,ril) = 
             (SELECT DISTINCT ctry_id,city_id,address1,address2,zip,contact_phone,bl_name,ril
             FROM INT_I9_TEMP_BL WHERE INT_I9_TEMP_BL.bl_id = r.bl_id and data_codeiso3 = 0 AND data_pole = 1);
    --Sans site et sans pays         
             UPDATE bl SET (city_id,address1,address2,zip,contact_phone,name,ril) = 
             (SELECT DISTINCT city_id,address1,address2,zip,contact_phone,bl_name,ril
             FROM INT_I9_TEMP_BL WHERE INT_I9_TEMP_BL.bl_id = r.bl_id and data_codeiso3 = 1 AND data_pole = 1);
     
    --valide la MAJ
            UPDATE INT_I9_TEMP_BL set data_bl_upd = 0 WHERE INT_I9_TEMP_BL.bl_id = r.bl_id;
     
     
    EXCEPTION
    WHEN OTHERS THEN
    err_msg := sqlerrm;
     
     UPDATE INT_I9_TEMP_BL set data_bl_upd = 1,
     data_error = 5,
     data_comments = ('Erreur lors de la mise à jour de l immeuble '||err_msg) -- erreur type5
     WHERE INT_I9_TEMP_BL.bl_id = r.bl_id;
     
     INSERT INTO LOG_I9_BL (log_date, log_type, log_comments, bl_id,name,address1,address2,contact_phone,site_id,city_id,state_id,zip,ctry_id)
     SELECT today, 'ERROR' ,data_comments, bl_id,name,address1,address2,contact_phone,site_id,city_id,state_id,zip,ctry_id from INT_I9_TEMP_BL 
     WHERE INT_I9_TEMP_BL.bl_id = r.bl_id;   
    END;
    END LOOP;
    commit;
    END;
     
    -- FIN DE MAJ DES INFOS IMMEUBLES
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    2 remarques:
    1) est-ce qu'il n'est pas possible de faire celà en une seule requête update, voire 5 requête traitant les 5 cas. Je n'ai pas regardé en détail, mais le traitement ligne par ligne n'est pas forcément optimal.

    2) -plus grave-
    en cas d'erreur -et n'importe quelle erreur - tu fais un commit de tout ce qui a été fait. En général on a des transactions et on veut soit que tout marche jusqu'au bout, soit que tout soit rollbacké

    Il faudrait:
    - identifier les erreurs possibles au lien de faire un 'when other' général
    - utiliser une transaction autonome s'il faut écrire quelque chose dans une table en cas d'erreur

    Cordialement,
    Franck.

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut
    Merci pour ta réponse.

    1)Effectivement la il va faire mes 4 requetes séquentiellement, alors qu'il y en aura chaque fois qu'une seule qui va rééllement écrire qqch, et je ne sais ps comment faire. apparement on ne peut pas mettre une requete dans un case ou dans un if. C'est un peut ma question de ce post, comment faire cette requete proprement. je viens de me retrouver parachuter sur oracle et c'est pas facile

    2)du moment que j'ai une erreur, ma requete ne vas pas s'exécuter correctement et lancer l'exception et écrire dans ma table de log. il faudrait peut -etre que je mette un commit juste après le traitement de l'exception.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/06/2012, 16h04
  2. Réponses: 1
    Dernier message: 27/04/2012, 16h41
  3. Réponses: 0
    Dernier message: 17/03/2011, 21h42
  4. le fonctionnement interne des outil d'execution des tests
    Par geforce dans le forum Développement Web en Java
    Réponses: 11
    Dernier message: 15/01/2010, 13h41
  5. Réponses: 13
    Dernier message: 21/04/2006, 15h39

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