Vous n'êtes pas identifié(e).
Pages : 1
Bonjour !
j'aimerais écrire une fonction en pl/pgsql qui reçoit en paramètre la variable NEW (en INOUT) depuis la fonction trigger. En effet, depuis plusieurs trigger j'aimerais appeler la même fonction pour ne pas devoir dupliquer le code.
J'ai recherché sur le forum et ailleurs, mais en vain.
Voici le code de ma procédure:
CREATE OR REPLACE PROCEDURE autogen_audit(rec INOUT RECORD, op IN VARCHAR)
LANGUAGE PLPGSQL AS $BODY$
BEGIN
IF op='INSERT' THEN
rec.ajUser := CURRENT_USER;
rec.ajDate := CURRENT_TIMESTAMP;
ELSIF op= 'UPDATE' THEN
rec.moUser := CURRENT_USER;
rec.moDate := CURRENT_TIMESTAMP;
END IF;
END;
$BODY$;
ma fonction trigger est la suivante :
CREATE OR REPLACE FUNCTION Usa_BIR() RETURNS TRIGGER AS $BODY$
DECLARE
tableName VARCHAR;
BEGIN
tableName := TG_TABLE_NAME;
-- Alimentation de la PK indépendante
IF NEW.num IS NULL THEN
NEW.num := NEXTVAL('Usa_SEQPK');
END IF;
-- Alimentation des colonnes d'audit
CALL autogen_audit(NEW, TG_OP);
-- Journalisation
--CALL Usa_ins_jn(NEW, TG_OP);
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
Comment dois-je déclarer le paramètre rec dans la procédure autogen_audit ? si je le déclare en RECORD, j'ai le message d'erreur suivant :
ERROR: ERREUR: row not compatible with its own tupdesc
CONTEXT: fonction PL/pgSQL autogen_audit(record,character varying), ligne 0 à RETURN
instruction SQL « CALL autogen_audit(NEW, TG_OP) »
fonction PL/pgSQL usa_bir(), ligne 23 à CALL
SQL state: XX000
En PL/SQL Oracle, on peut passer NEW en paramètre en le typant %ROWTYPE, ce qui ne semble pas non plus possible en plpgsql
J'aimerais aussi sur le même principe faire des procédures ou fonctions pour séparer la logique du code des triggers.
Un grand merci d'avance !
Fabrice.
Hors ligne
Je ne comprends pas la raison de l'erreur, mais utilisez plutôt une fonction plutôt qu'une procédure pour autogen_audit. L'intérêt des procédures est de pouvoir faire du contrôle de transaction mais ici ça n'est pas pertinent.
Si autogen_audit était une fonction, la fonction appelante ferait
NEW := autogen_audit(NEW, TG_OP);
et ça devrait fonctionner.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Super merci beaucoup, en effet ça fonctionne avec une fonction !
Hors ligne
Pages : 1