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

Function: ps_maj_specificite

 

 

Schema

public

 

Owner

postgres

 

Descriptions

Cette fonction utilise le contenue de la table contenant les anomalies pour le couple robot/projet passé en paramètre afin de positionner des indicateurs qui permettront de corriger les variables calculées si besoin.

 

Options

Option

Value

Returns

boolean

Language

plpgsql

Parameters

prefix_robot varchar

nom_projet varchar

 

Definition

CREATE OR REPLACE FUNCTION public.ps_maj_specificite (
 prefix_robot varchar,
 nom_projet varchar
)
RETURNS boolean AS
$span$
DECLARE


curs_ano refcursor; -- Curseur recevant les informations de la table des spécificités traitée.
rec_ano record; -- Enregistrement contenant la spécificité en cours de traitement
nom_table VARCHAR; -- Nom de la table contenant les spécificités pour le couple Robot /Projet en cours
requete text; -- Variable contenant le texte de requête à exécuter

id_robot INTEGER; -- ID du robot concerné par le traitement
id_projet INTEGER; -- ID du projet concerné par le traitement

horodatage_deb timestamp; -- Horodatage de début de la spécificité.
horodatage_fin timestamp; -- Horodatage de fin de la spécificité.

BEGIN
SELECT
rob_id FROM tr_robot_rob WHERE lower(rob_prefix) = lower(prefix_robot) INTO id_robot;
IF NOT found THEN
     raise notice
'Erreur - Préfixe robot introuvable : % ', prefix_robot;
 return FALSE;
END IF;

nom_table = 't_ano_' || lower(prefix_robot) || '_';

SELECT pjt_id FROM t_projet_pjt WHERE lower(pjt_nom) = lower(nom_projet) INTO id_projet;
IF NOT found THEN
     raise notice
'Erreur - Nom projet introuvable : % ', nom_projet;
 return FALSE;
END IF;

nom_table = nom_table || lower(nom_projet);

   requete = 'GRANT SELECT ON ' || nom_table || ' TO robot_lecture;';
   EXECUTE requete;
   requete = 'GRANT ALL ON ' || nom_table || ' TO robot_ecriture;';
   EXECUTE requete;

requete = 'SELECT * FROM ' || nom_table || ';';


OPEN curs_ano FOR -- Récupération des données de la table des spécificités.
  EXECUTE requete ;
   
   LOOP
     FETCH curs_ano into rec_ano;
     IF found THEN
           raise notice
'Info  :  Palette % - % %' , rec_ano.ano_numero_palette , rec_ano.ano_dateout , rec_ano.ano_timeout ;

           IF (rec_ano.ano_dateout = rec_ano.ano_datereturn) AND (rec_ano.ano_timeout = rec_ano.ano_timereturn)  THEN
-- Met à jour la mesure correspondante
UPDATE t_datarobot_dat SET dat_taadd = rec_ano.ano_arrosage_main, dat_coadd = rec_ano.ano_weight_added WHERE dat_id IN
(SELECT
 public
.t_datarobot_dat.dat_id
FROM
 public
.tj_emplacement_plt_rob_emp
 INNER JOIN public.t_plant_plt ON (public.tj_emplacement_plt_rob_emp.emp_plt_id = public.t_plant_plt.plt_id)
 INNER JOIN public.t_datarobot_dat ON (public.t_plant_plt.plt_id = public.t_datarobot_dat.dat_plt_id)
WHERE
 public
.t_datarobot_dat.dat_palette = rec_ano.ano_numero_palette AND
 public
.tj_emplacement_plt_rob_emp.emp_rob_id = id_robot AND
 dat_date = rec_ano.ano_dateout AND dat_time = rec_ano.ano_timeout
);
ELSE -- La palette est sortie du robot ; on passe l'indicateur dat_taout à TRUE pour les mesures incluses dans la période de sortie.
horodatage_deb = "timestamp"(date(rec_ano.ano_dateout),"time"(rec_ano.ano_timeout));
horodatage_fin = "timestamp"(date(rec_ano.ano_datereturn),"time"(rec_ano.ano_timereturn));
UPDATE t_datarobot_dat SET dat_taout = TRUE WHERE dat_id IN
                (SELECT
 public
.t_datarobot_dat.dat_id
FROM
 public
.tj_emplacement_plt_rob_emp
 INNER JOIN public.t_plant_plt ON (public.tj_emplacement_plt_rob_emp.emp_plt_id = public.t_plant_plt.plt_id)
 INNER JOIN public.t_datarobot_dat ON (public.t_plant_plt.plt_id = public.t_datarobot_dat.dat_plt_id)
WHERE
 public
.t_datarobot_dat.dat_palette = rec_ano.ano_numero_palette AND
 public
.tj_emplacement_plt_rob_emp.emp_rob_id = id_robot AND
 dat_horodatage BETWEEN horodatage_deb AND horodatage_fin
);
               
-- Test s'il y a eu ajout d'eau ou de poids durant la période de sortie - dans ce cas on affecte la matière ajoutée au cycle de mesure immédiatement postérieur à l'horodatage de retour de la palette sur le pot.
IF (rec_ano.ano_arrosage_main <> 0) OR (rec_ano.ano_weight_added <> 0) THEN
UPDATE
t_datarobot_dat SET dat_taadd = rec_ano.ano_arrosage_main, dat_coadd = rec_ano.ano_weight_added WHERE dat_id IN
                       (SELECT
                             public
.t_datarobot_dat.dat_id
                           FROM
                             public
.tj_emplacement_plt_rob_emp
                             INNER JOIN public.t_plant_plt ON (public.tj_emplacement_plt_rob_emp.emp_plt_id = public.t_plant_plt.plt_id)
                             INNER JOIN public.t_datarobot_dat ON (public.t_plant_plt.plt_id = public.t_datarobot_dat.dat_plt_id)
                           WHERE
                             public
.t_datarobot_dat.dat_palette = rec_ano.ano_numero_palette AND
                             public
.tj_emplacement_plt_rob_emp.emp_rob_id = id_robot AND
                             dat_horodatage > horodatage_fin ORDER BY dat_horodatage LIMIT 1
                       );                   
END IF;

           END IF;
          
      ELSE
        exit
;
           
     END IF;
   END LOOP;
   close curs_ano ;
   return true;
   
EXCEPTION
WHEN
OTHERS THEN
     raise notice
'Erreur : % %', sqlstate, sqlerrm;
     return false;
END;
$span$
LANGUAGE
'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST
100;

COMMENT ON FUNCTION public.ps_maj_specificite(prefix_robot varchar, nom_projet varchar)
IS 'Cette fonction utilise le contenue de la table contenant les anomalies pour le couple robot/projet passé en paramètre afin de positionner des indicateurs qui permettront de corriger les variables calculées si besoin.';

This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 26/02/2014 11:51
Previous topic Chapter index Next topic