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.

Voici le code de ma procédure:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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, appel que l'on retrouvera dans toutes les fonctions trigger INSERT/UPDATE
 	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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
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.