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

#1 10/09/2020 13:33:53

fabricecamus
Membre

Passer NEW en paramètre d'une procédure

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

#2 14/09/2020 17:35:44

dverite
Membre

Re : Passer NEW en paramètre d'une procédure

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.

Hors ligne

#3 15/09/2020 16:38:27

fabricecamus
Membre

Re : Passer NEW en paramètre d'une procédure

Super merci beaucoup, en effet ça fonctionne avec une fonction !

Hors ligne

Pied de page des forums