Schema
Owner
postgres
Descriptions
Fonction de positionnnement des indicateurs de suivi des campagnes de positionnement
Options
Option | Value |
---|---|
Returns |
integer |
Language |
|
Parameters |
annee_suivi integer tolerance_nb_min integer = 4 |
Definition
CREATE OR REPLACE FUNCTION public.ps_maj_indic_cpos (
annee_suivi integer,
tolerance_nb_min integer = 4
)
RETURNS integer AS
$span$
DECLARE
curs_campagne refcursor; -- Curseur recevant les informations des campagnes
rec_campagne record; -- Enregistrement contenant la campagne en cours de traitement
i INTEGER;
camp_ani_id int4; -- variable recevant l'identifiant animal permettant de détecter les changements d'animaux
camp_id INTEGER[3]; -- Tableau recevant les identifiants des dernières campagnes analysées
camp_ts TIMESTAMP[3]; -- Tableau recevant les timestamp (date et heure) des dernières campagnes analysées
delta_nb_minute INTEGER[3]; -- Tableau recevant les delta des dernières campagnes analysées (nombre de minutes entre une campagne et la précédente
tmp_interval INTERVAL; -- Variable temporaire stockant la différence de 2 variables de type timestamp
camp_delta_encours INTEGER; --
nbcamp INTEGER; -- Variable contenant le nombre de campagnes analysées et retourné en fin de traitement
camp_id_tmp INTEGER; -- Variable contenant l'identifiant de la campagne à modifier, les commandes SQL UPDATE ne pouvant accepter une variable issue d'un tableau
-- Par exemple UPDATE ... WHERE cpos_ID = camp_id[2] est en erreur.
BEGIN
-- Initialisation des variables
camp_ani_id := 0;
nbcamp :=0;
-- Réinitialise les indicateurs
UPDATE t_campagne_pos_cpos set cpos_prog6heure = FALSE, cpos_prog4heure = FALSE, cpos_prog3heure = FALSE, cpos_prog1heure = FALSE, cpos_prog10minutes = FALSE WHERE public.t_campagne_pos_cpos.cpos_annee_suivi = annee_suivi;
raise notice 'Réinitialisation des indicateurs terminée';
open curs_campagne FOR
SELECT
public.t_campagne_pos_cpos.cpos_ani_id,
public.t_animal_ani.ani_etiq,
public.t_campagne_pos_cpos.cpos_id,
public.t_campagne_pos_cpos.cpos_date,
public.t_campagne_pos_cpos.cpos_heure,
"timestamp"(cpos_date, cpos_heure) AS cpos_tscamp,
MAX(public.t_capture_cap.cap_date) AS date_capture
FROM
public.t_campagne_pos_cpos
INNER JOIN public.t_animal_ani ON (public.t_campagne_pos_cpos.cpos_ani_id = public.t_animal_ani.ani_id)
INNER JOIN public.t_capture_cap ON (public.t_animal_ani.ani_id = public.t_capture_cap.cap_ani_id)
WHERE
public.t_capture_cap.cap_date <= public.t_campagne_pos_cpos.cpos_date and
public.t_campagne_pos_cpos.cpos_annee_suivi = annee_suivi
GROUP BY
public.t_campagne_pos_cpos.cpos_ani_id,
public.t_animal_ani.ani_etiq,
public.t_campagne_pos_cpos.cpos_id,
public.t_campagne_pos_cpos.cpos_date,
public.t_campagne_pos_cpos.cpos_heure,
cpos_tscamp
ORDER BY
public.t_animal_ani.ani_etiq,
public.t_campagne_pos_cpos.cpos_date,
public.t_campagne_pos_cpos.cpos_heure;
LOOP
FETCH curs_campagne into rec_campagne;
nbcamp := nbcamp +1;
if found then
camp_id[3] := rec_campagne.cpos_id;
camp_ts[3] := rec_campagne.cpos_tscamp;
-- Analyse s'il y a changement d'animal.
if (camp_ani_id <> rec_campagne.cpos_ani_id) THEN -- Changement d'animal
raise notice 'animal : %', rec_campagne.cpos_ani_id; -- Debug info
camp_ani_id := rec_campagne.cpos_ani_id;
camp_id[1] := 0;
camp_id[2] := 0;
camp_ts[1] := rec_campagne.cpos_tscamp;
camp_ts[2] := rec_campagne.cpos_tscamp;
delta_nb_minute[1] := 0;
delta_nb_minute[2] := 0;
i:=0;
end if;
-- Calcul du delta avec la campagne précédente et vérifications inter-campagnes
tmp_interval = camp_ts[3] - camp_ts[2];
--Normalisation du delta.
camp_delta_encours = ps_normalise_interval(tmp_interval);
delta_nb_minute[3] = camp_delta_encours;
if (delta_nb_minute[2] <> delta_nb_minute[1]) and (delta_nb_minute[2] <> delta_nb_minute[3]) and (camp_id[2]<>0)then
-- La valeur de delta pour la campagne n-1 est différente du delta des campagnes n-2 et n.
-- Mise à jour du delta de la campagne n-1
camp_id_tmp = camp_id[2];
UPDATE t_campagne_pos_cpos set cpos_delta = 0 where cpos_id = camp_id_tmp;
end if;
UPDATE t_campagne_pos_cpos set cpos_delta = camp_delta_encours where cpos_id = rec_campagne.cpos_id;
camp_id[1] := camp_id[2];
camp_id[2] := camp_id[3];
camp_ts[1] := camp_ts[2];
camp_ts[2] := camp_ts[3];
delta_nb_minute[1] := delta_nb_minute[2];
delta_nb_minute[2] := delta_nb_minute[3];
-- Campagnes 2003 - Des campagnes à 4 heures uniquement
if (rec_campagne.date_capture > '01/11/2002') and (rec_campagne.date_capture < '01/04/2003') THEN
if ps_suivi4h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog4heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
end if;
if (rec_campagne.date_capture > '01/11/2003') and (rec_campagne.date_capture < '01/04/2004') THEN
if ps_suivi4h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog4heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
if ps_suivi3h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog3heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
if ps_suivi6h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog6heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
end if;
if (rec_campagne.date_capture > '01/11/2004') and (rec_campagne.date_capture < '01/04/2005') THEN
if ps_suivi6h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog6heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
if (camp_delta_encours = 10) THEN
UPDATE t_campagne_pos_cpos set cpos_prog10minutes = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
end if;
if (rec_campagne.date_capture > '01/11/2005') THEN
if ps_suivi6h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog6heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
if ps_suivi1h(rec_campagne.cpos_heure,tolerance_nb_min) then
UPDATE t_campagne_pos_cpos set cpos_prog1heure = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
if (camp_delta_encours = 10) THEN
UPDATE t_campagne_pos_cpos set cpos_prog10minutes = TRUE where cpos_id = rec_campagne.cpos_id;
end if;
end if;
i:= i+1;
else
exit;
end if;
END LOOP;
return nbcamp ;
EXCEPTION
WHEN OTHERS THEN
raise notice 'animal : %', rec_campagne.cpos_ani_id;
raise notice 'Erreur : % %', sqlstate, sqlerrm;
return nbcamp;
END;
$span$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
COMMENT ON FUNCTION public.ps_maj_indic_cpos(annee_suivi integer, tolerance_nb_min integer)
IS 'Fonction de positionnnement des indicateurs de suivi des campagnes de positionnement';
This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 13/03/2014 13:23 |