Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/04/2007, 20h27   #1
Candidat au titre de Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 62
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 62
Points : 11
Points : 11
Par défaut [10gXE][PL/SQL] trigger + table mutante

Voila en ce moment je suis en train de tester les tables objet relationnel et pour assurer l'intégrité référentiel j'ai du créer un trigger (before insert) qui vérifie donc quan j'insert une nouvelle ligne si une référence n'est pas déja contenu dans la table ou pointe cette référence.

Voila la table concerné par le trigger :

Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE operation
(num_op char(5) PRIMARY KEY NOT  NULL,
salleop char(15),
dateop date,
description char(30),
refpat REF t_patient scope IS ob_patient,
listeactes t_liste_actes)
nested TABLE listeactes store AS acte_tab;
et voila le trigger en question :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE TRIGGER trig_patient
  before INSERT ON operation
  FOR each row
declare
nbr number;
table_mutante exception;
pragma exception_init(table_mutante, -4091);
begin
  SELECT count(*) INTO nbr
    FROM operation
    WHERE refpat = :NEW.refpat;
  IF NOT (nbr = 0) then
    Raise_application_error(-20101,'Pb unicité : doublon');
  end IF;
  exception when table_mutante then 
  dbms_output.put_line('Fausse alerte');
end;
j'ai dû capturer l'erreur "-4091 table mutante" parce que quand j'essayais d'insert une nouvelle ligne il m'affichait cette erreur.

Mais a présent le trigger ne m'affiche plus l'erreur. Il ne fait rien, même quand je met la même référence il ajoute la ligne.

Voila si vous pouviez me dire comment résoudre mon probleme je vous serais trés reconnaissant^^.

ps : mon insert de test

Code :
1
2
3
4
INSERT INTO operation 
SELECT '1','salle 1','17/06/07','Transplantation', ref(p), t_liste_actes(t_acte('A01', 'radio thorax', 1234.56, ref(m))) 
FROM ob_patient p, ob_medecin m 
WHERE num_p = '1' AND num_m = '1';
Bien evidemment il y a déja une ligne dans la table avec le meme patient en référence.
<% Bastien %> est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 08h41   #2
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
http://sgbd.developpez.com/oracle/ora-04091/

Merci d'indiquer votre version d'Oracle et je vous rappelle qu'il existe un forum sur Oracle dans lequel votre message aurait sa place...
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 09h31   #3
Candidat au titre de Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 62
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 62
Points : 11
Points : 11
Bonjour, oui j'ai chercher le bon forum mais je n'avais pas vu qu'il y en avait un pour oracle.

Pour ce qui est du lien que tu propose je suis déja aller voir la bas c'est justement avec ce tuto que j'ai adopté la technique pour ignorer l'erreur. Malheuresement comme je l'ai dis apres cette modif le trigger ne fonctionne plus correctement..

Voila si mon post ne correspond pas a cette parti du forum vous pouvez le déplacer dans la partie approprié.

Edit : Ah j'oubliais j'ai la version 10g de Oracle (Express Edition)
<% Bastien %> est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 09h59   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tu seras toujours en table_mutante : Tu ne peux pas lire la table sur laquelle le trigger fait référence.

Un moyen de contournement : Créer une fonction autonome (PRAGMA AUTONOMOUS_TRANSACTION) qui va faire ton count(*)

Mais dans ce cas si tu insères 2 fois la même ligne sans commiter, la procédure ne les verra pas.

Solution simple : créer un index unique sur refpat.
Oracle le gère tout seul
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 14h27   #5
Candidat au titre de Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 62
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 62
Points : 11
Points : 11
ah ok merci j'ai utiliser un index et maintenant ca fonctionne. J'ai voulus faire un trigger parce que notre professeur dans son poilycopié disait qu'on était obliger de créer un trigger, mais j'imagine que c'est uniquement valable pour les tables objet.
<% Bastien %> est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 14h49   #6
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Un peu petit conseil : ne fais jamais le travail d'Oracle parce qu'il le fait mieux que nous, et si on essaie de le faire on aura que des problèmes.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h19.


 
 
 
 
Partenaires

Hébergement Web