Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 Re : Site PostgreSQL.fr » Passer NEW en paramètre d'une procédure » 15/09/2020 16:38:27
Super merci beaucoup, en effet ça fonctionne avec une fonction !
#2 Site PostgreSQL.fr » Passer NEW en paramètre d'une procédure » 10/09/2020 13:33:53
- fabricecamus
- Réponses : 2
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.
Pages : 1