s to tylko przykład w rzeczywistości wygląda to tak:
CREATE OR REPLACE FUNCTION pojazdy.f_tri_ai_xxx() RETURNS trigger AS
$$
DECLARE
idpk_poj INTEGER;
idpk_info_diag SMALLINT;
int_nr_diag INTEGER;
czas TIMESTAMP;
BEGIN
idpk_info_diag := NEW.idfk_nr_diag;
idpk_poj := (trim(leading '_' from TG_TABLE_NAME)::varchar)::integer;
int_nr_diag :=pojazdy.f_sint_nr_info_diag_int(idpk_info_diag);
IF (int_nr_diag >=16 AND int_nr_diag <=25) THEN
EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
RETURN NEW;
ELSE
IF (pojazdy.f_int_int_if_start_bool(idpk_poj,idpk_info_diag)= TRUE) THEN
IF(pojazdy.f_int_int_t_actual_bool(idpk_poj, idpk_info_diag) = FALSE) THEN
EXECUTE 'INSERT INTO pojazdy.t_actual (dt_dg,idfk_poj,idfk_diag)
VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
RETURN NEW;
ELSE
RETURN NULL;
END IF;
ELSE
IF(pojazdy.f_int_int_if_start_exists_bool(idpk_poj,idpk_info_diag)=TRUE)THEN
czas := pojazdy.f_int_int_start_dt(idpk_poj,idpk_info_diag);
EXECUTE 'INSERT INTO pojazdy.t_history (dt_start,dt_stop,idfk_poj,idfk_diag)
VALUES ('''||czas||''','''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
EXECUTE 'DELETE FROM pojazdy.t_actual
WHERE idfk_poj = '||idpk_poj||' AND idfk_diag = '||pojazdy.f_int_idpk_info_diag_sint(idpk_poj,int_nr_diag-100)||'';
EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
RETURN NEW;
ELSE
RETURN NULL;
END IF;
END IF;
END IF;
END;
$$
LANGUAGE PLPGSQL;