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

#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.

Pied de page des forums

Propulsé par FluxBB