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 :

Trigger on update


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Par défaut Trigger on update
    Bonjour,

    Je suis sur Oracle 10g express edition.
    J'ai une base de données d'une entreprise de sous-titrage pour lequel on doit spécifier un lieu de stockage une fois le travail effectué: en magasin ou sur serveur (c'est un exercice).
    Je cherche a créer un déclencheur qui assure que tout travail effectué est stocké au moins d'une des deux façons.

    J'ai décidé qu'on pouvait insérer dans la table sous_titres les données permettant de l'identifier si le travail n'est pas fini (attribut "fait" = non). On peut spécifier ensuite un lieu de stockage et une fois le travail fait, on update "fait" à oui, ce qui déclenche le trigger pour vérifier que le travail a bien un lieu de stockage.

    Mon problème est que dans ce trigger je n'arrive pas à récupérer les valeurs de "titre", "année" de la ligne mise à jour pour chercher dans les relations Serveur et Magasin si le travail de sous-titrage est bien effectué

    J'ai l'impression qu'en updatant seulement "fait" :new ne contient pas les valeurs des champs "titre" et "année" de la ligne mise a jour. Je récupère toujours l'exception no_data_found.

    Est-ce que je m'y prends mal pour résoudre le problème ou est-ce mon déclencheur qui est mal codé?
    Faire un select into pour voir si une valeur donnée se trouve dans la table et conclure que si rien n'est sélectionné n'est sûrement pas la meilleure façon de s'y prendre, comment vérifier que le sous titre identifier par le titre l'année et un num-soustitre est présent dans Magasin ou Serveur?



    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
    CREATE OR REPLACE TRIGGER Ctrl_Mag_Serv
    AFTER UPDATE ON Sous_titre
    FOR EACH ROW
     
    DECLARE
     
    Vnumero_sous                            VARCHAR2(8);
     
    BEGIN
    Vnumero_sous:='rien'
    IF :new.fait = 'oui' THEN
     
     
     
    SELECT numero_sous INTO Vnumero_sous 
    FROM Magasin
    WHERE Magasin.titre_original = :NEW.titre_original AND Magasin.Annee = :NEW.annee;
     
    SELECT numero_sub INTO Vnumero_sub 
    FROM Serveur
    WHERE Serveur.titre_original = :new.titre_original AND Serveur.Annee = :new.annee;
     
     
     
    IF vnumero_sous IS NULL THEN
    RAISE_APPLICATION_ERROR(-20000, 'Impossible de trouver le sous-titre en magasin ou serveur, d'abord spécifier un lieu de stockage avant de mettre à jour l'attribut fait ');
    END IF;
     
     
    END IF;
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line('Pas trouvé.');
     
     
    END Ctrl_Almac;


    J'ai aussi fait un déclencheur qui interdit d'insérer une ligne contenant fait=oui, qui fonctionne.


    Merci de votre attention

    edit : dans la section Oracle peut-être?

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Les valeurs de :NEW contiennent bien tous les champs de l'enregistrement après UPDATE, même pour les colonnes qui ne sont pas mises à jour. Pour s'en assurer, il suffit de les afficher avec un petit DBMS_OUTPUT.
    Le problème doit donc venir des données dans les 2 autres tables.

    Pour ne pas générer d'exception NO_DATA_FOUND, tu peux faire un COUNT pour que les requêtes retournent toujours 1 et 1 seule ligne, et ensuite tester le nombre de lignes trouvées.

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Par défaut
    Merci, j'ai trouvé l'astuce du count sur une autre page, quelque temps après
    en ce qui concerne le dbms_output, il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put(:new.colonne)
    ?

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBMS_OUTPUT.PUT_LINE ('new.colonne=' || :NEW.colonne);
    Pour toute les informations sur DBMS_OUTPUT, la doc Oracle est disponible ici: http://download.oracle.com/docs/cd/B...t.htm#ARPLS036

Discussions similaires

  1. Trigger et update
    Par Solovely dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2006, 17h36
  2. Trigger if update
    Par b_lob dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 20/04/2006, 14h49
  3. [8i][forms 6i] trigger PRE-UPDATE
    Par Magnus dans le forum Oracle
    Réponses: 6
    Dernier message: 21/02/2006, 11h57
  4. TRIGGER After Update
    Par Nounoursonne dans le forum Oracle
    Réponses: 8
    Dernier message: 20/07/2005, 13h33
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

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