pggeodb.nancy.inra.fr/db_cefs - db_cefs on pggeodb.nancy.inra.fr
Previous topic Chapter index Next topic

Function: ps_maj_indic_cpos

 

 

Schema

public

 

Owner

postgres

 

Descriptions

Fonction de positionnnement des indicateurs de suivi des campagnes de positionnement

 

Options

Option

Value

Returns

integer

Language

plpgsql

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
Previous topic Chapter index Next topic