Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 13-06-2014 20:40:56

okayassu
Membre
Inscription : 08-03-2014
Messages : 16

[SQL] archiver avant d'effacer

Bonsoir :)


je dois faire un trigger qui archive de 2 tables différentes avant d'effacer , j'ai donc crée une table pour archiver , mais lorsque que je lance la fonction que j'ai crée pour effacer cela me renvoie une erreur (ma fonction pour effacer fonctionne sans le trigger )


je reçois cette erreur que je ne comprends pas :

ERREUR:  l'enregistrement « old » n'a pas de champs « nometudiant »
CONTEXTE : instruction SQL « SELECT old.nometudiant »
fonction PL/pgsql archivage(), ligne 17 à affectation
instruction SQL « delete from periodes where numstage in
(select numstage from stages where numetudiant = numero) »
fonction PL/pgsql suppretudiant(character varying), ligne 11 à instruction SQL

ci dessous ma fonction pour effacer ainsi que mon trigger :

CREATE OR REPLACE FUNCTION suppretudiant(etudiant character varying)
  RETURNS void AS
$BODY$
declare
   numero integer;
 
begin
    select numetudiant into numero from etudiants
    where nometudiant = etudiant;
    IF NOT FOUND THEN
        RAISE EXCEPTION 'etudiant % est inexistant',etudiant;
    END IF;
delete from periodes where numstage in
(select numstage from stages where numetudiant = numero);
     delete from stages where numetudiant= numero;
    delete from etudiants where numetudiant = numero;
    return ;
end;
$BODY$
  LANGUAGE plpgsql ;
 
create or replace function archivage() returns trigger as
$$
declare
nometud varchar;
prenometud varchar;
numsta integer;
titresta varchar;
objetsta varchar;
anneescol date;
numetud integer;
regimeetud varchar;
numconta integer;
numprofsuiv integer;
remarque varchar;

begin

nometud:=old.nometudiant;  
select nometudiant into nometud from etudiants where nometudiant=nometud;
prenometud:=old.prenometudiant;
select prenometudiant into prenometud from etudiants where prenometudiant=prenometud;
numsta:=old.numstage;
select numstage into numsta from stages where numstage=numsta;
titresta:=old.titrestage;
select titrestage into titresta from stages where numstage=numsta;
objetsta:=old.objetstage;
select objetstage into objetsta from stages where numstage=numsta;
anneescol:=old.anneescolaire;
select anneescolaire into anneescol from stages where numstage=numsta;
numetud:=old.numetudiant;
select numetudiant into numetud from stages where numstage=numsta;
regimeetud:=old.regimeetudiant;
select regimeetudiant into regimeetud from stages where numstage=numsta;
numconta:=old.numcontact;
select numcontact into numconta from stages where numstage=numsta;
numprofsuiv:=old.numprofsuiveur;
select numprofsuiveur into numprofsuiv from stages where numstage=numsta;
remarque:=old.remarques;
select remarques into remarque from stages where numstage=numsta;
insert into archive values (default,nometud,prenometud,numsta,titresta,objetsta,anneescol,numetud,regimeetud,numconta,numprofsuiv,remarque);
return old;

end;
$$
language plpgsql;

create trigger archivage before delete on stages
for each row execute procedure archivage();

create trigger archivage before delete on etudiants
for each row execute procedure archivage();

create trigger archivage before delete on periodes
for each row execute procedure archivage();

si quelqu'un avait une petite idée de l'erreur ?

merci d'avance

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
soixante cinq plus dix-huit
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums