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 02/07/2007, 15h09   #1
Membre éclairé
 
Inscription : avril 2006
Messages : 352
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 352
Points : 378
Points : 378
Par défaut Récupérer ligne entière dans trigger

Bonjour,
Je bloque sur un problème dans mon trigger.
J'ai un table qui contient des utilisateurs avec une trentaine de champs (numéro personne, téléphone, manager,...)
J'exporte ces données depuis excel.
Je voudrais créér un trigger qui si l'utilisateur existe déjà fait juste un update.
Voici le code de mon trigger :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace
trigger BIER_USER
BEFORE INSERT on USER 
FOR EACH ROW
declare 
	nb_user integer;
	exist_user exception;
begin
	select count(core_id) into nb_user
	from resmgt_mot_user
	where core_id = :new.core_id;
	
	if nb_user > 0 then
		raise exist_user;
	end if;
	
	EXCEPTION
    --If the person is already register in the database then update
    WHEN exist_user THEN
    	pkg_resmgt.update_user(:new);
end;
ma procédure update_user prend en paramètre une variable de type user%ROWTYPE. Seulement je ne trouve pas comment récupérer toute la ligne qui devrait être insérée... sur la ligne colorée en rouge, à la compilation il me dit : "Error(21,40): PLS-00049: bad bind variable 'NEW'". J'ai essayé :new.*, :new.all, :new.row, rien n'y fait...

Quelqu'un aurait une idée ???
Taoueret est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 15h11   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ce n'est pas possible, tu dois updater toutes les colonnes.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 15h15   #3
Membre éclairé
 
Inscription : avril 2006
Messages : 352
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 352
Points : 378
Points : 378
vu que je fais l'update sur la même table que li'nsert, je suis obligée de passer par une procédure sinon j'ai l'erreur "table mutante". ca veut donc dire que ma procédure doit prendre en paramètre les 30 champs ?? Où y'a-t-il une solution plus simple ?

Merci
Taoueret est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 15h29   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
tu dois créer un enregistrement, style

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create or replace
trigger BIER_USER
BEFORE INSERT on USER 
FOR EACH ROW
declare 
   rec user%rowtype;
begin
   rec.col1 := :new.col1;
   rec.col2 := :new.col2;
   rec.col3 := :new.col3;
   rec.col30 := :new.col30;
   pkg_resmgt.update_user(rec);
end;
/
je ne vois pas plus simple
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 20h16   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Taoueret
vu que je fais l'update sur la même table que li'nsert, je suis obligée de passer par une procédure sinon j'ai l'erreur "table mutante". ca veut donc dire que ma procédure doit prendre en paramètre les 30 champs ?? Où y'a-t-il une solution plus simple ?

Merci
oui, la commande MERGE en lieu et place d'INSERT
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 07h35   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par orafrance
oui, la commande MERGE en lieu et place d'INSERT
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2007, 14h49   #7
Membre éclairé
 
Inscription : avril 2006
Messages : 352
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 352
Points : 378
Points : 378
Merci beaucoup pour ces réponses constructives !! C'est vrai que j'avais oublié le merge J'ai pas tellement l'habitude de l'utiliser en même temps... Merci encore
Taoueret est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web