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 :

update trigger qui update la même table


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut update trigger qui update la même table
    Bonjour à tous et bonne année,

    Je cherche depuis un moment et mes tests ne sont pas concluants, alors je me permet de vous demander.
    J'ai créée un trigger sur une colonne spécifique d'une table et je voudrais que l'exécution mette à jour une autre colonne d'une autre ligne de la même table.
    Seulement, comme mentionné, mes tests ne donnent pas le résultat voulu.

    Voici la requête en question.

    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
    create or replace TRIGGER UPD_BANQUE
    AFTER UPDATE OF IDENTIFIER ON BANQUE
    FOR EACH ROW
    WHEN (OLD.TYPEBANQUE = 'guichet' AND OLD.GROUPEBANQUE = '06' AND NEW.IDENTIFIER != OLD.IDENTIFIER)
    DECLARE
                    new_bank_code BANQUE.IDENTIFIER%type;
    BEGIN 
     
                    SELECT c.CODE_BANQUE_CIBLE into new_bank_code FROM CORRESPONDANCE_BANK c
                    WHERE c.CODE_GUICHET_SOURCE = :OLD.IDENTIFIER
                                   AND c.CODE_GUICHET_CIBLE = :NEW.IDENTIFIER 
                                   AND c.CODE_BANQUE_SOURCE = (SELECT r.IDENTIFIER FROM BANQUE r WHERE r.GROUPEBANQUE = :NEW.GROUPEBANQUE AND TYPEBANQUE = 'etablissement');
     
    UPDATE BANQUE r SET IDENTIFIER = new_bank_code WHERE r.GROUPEBANQUE = :NEW.GROUPEBANQUE AND r.TYPEBANQUE = 'etablissement';
     
    END;

    niveau architecture, j'ai une table banque qui comprend les codes établissements et guichets, chaque ligne représentant une info, identifiée par le type. Les données sont liées par un code de groupe.
    Il y a aussi une table correspondance qui permet de trouver les correspondances entre les anciennes valeurs et les nouvelles, à la fois pour les guichet et pour les établissements.

    Je souhaite que l'établissement ne se mette à jour uniquement que si le guichet du même groupe à été changé (par le nouveau code de la table correspondance).


    D'avance merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour et bonne année.
    Tu ne peux faire ça, tu auras des erreurs de mutating table car tu essaies de lire une table en cours de modification. L'idéal c'est de le faire à l'endroit de l'appli qui fait cette mise à jour.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci, c'est ce que je craignais.
    Je vais devoir passer par une procédure.

    merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous avez quand même un sacré problème de modélisation !

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Vous pouvez tenter un COMPOUND TRIGGER:

    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
    CREATE OR REPLACE TRIGGER tg_upd_identifier_banque 
    FOR UPDATE OF identifier ON banque 
    ENABLE
    	WHEN (OLD.typebanque = 'guichet' AND OLD.groupebanque = '06' AND NEW.identifier != OLD.identifier)
    COMPOUND TRIGGER  
    	TYPE code_banque_cible_t IS TABLE OF correspondance_bank.code_banque_cible%TYPE INDEX BY BINARY_INTEGER;
      	v_code_banque_cibles code_banque_cible_t;
     
    	TYPE groupebanque_t IS TABLE OF banque.groupebanque%TYPE INDEX BY BINARY_INTEGER;
    	v_groupebanques groupebanque_t ;
     
     
    	AFTER EACH ROW IS 
    	BEGIN
        	SELECT c.code_banque_cible, :NEW.groupebanque  
    		INTO 
    			v_code_banque_cibles(v_code_banque_cibles.count + 1),
    			v_groupebanques(v_groupebanques.count + 1)
    		FROM correspondance_bank c
                WHERE c.code_guichet_source = :OLD.identifier
    				AND c.code_guichet_cible = :NEW.identifier 
    				AND c.code_banque_source = (
    					SELECT r.identifier FROM banque r 
    					WHERE r.groupebanque = :NEW.groupebanque 
    						AND r.typebanque = 'etablissement'
    					)
    		;
    	END AFTER EACH ROW;
     
     
      	AFTER STATEMENT IS 
      	BEGIN
        	FOR idx IN 1 .. v_code_banque_cibles.count
    	LOOP
    		UPDATE banque r SET identifier = v_code_banque_cibles(idx) 
    		WHERE r.groupebanque = v_groupebanques(idx) AND r.typebanque = 'etablissement'
    		;		
          	END LOOP ;
    	END AFTER STATEMENT;
    END; 
    /

Discussions similaires

  1. [WD17] HFiltre sur requete qui comporte une même table employée 2 fois
    Par droliprane dans le forum WinDev
    Réponses: 16
    Dernier message: 17/01/2013, 14h50
  2. Réponses: 2
    Dernier message: 11/08/2012, 10h28
  3. Transaction READ COMMITED bloque UPDATE sur même table
    Par stephane.julien dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/06/2011, 13h52
  4. Trigger avec update sur même table
    Par Thig dans le forum PL/SQL
    Réponses: 7
    Dernier message: 31/08/2007, 14h45
  5. Requête UPDATE qui rappelle la même table
    Par Linio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/06/2007, 09h54

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