Vous n'êtes pas identifié(e).

#76 Re : PL/pgSQL » Union Multiple » 09/11/2010 12:48:45

Merci pour message,
j'ai modifié le code, je souhaite utiliser une boucle for, mais je me prend mal, quelqu'un pourrait m'eclaircir.je souligne que j'utilise postgresql 8.1.
merci

-------------------
CREATE OR REPLACE FUNCTION "public"."absence_export_fonc2" (integer,integer)
RETURNS SETOF "public"."absence_export_type1" AS
$body$
DECLARE
mon_record absence_export_type1;
annee ALIAS FOR $1;
mois ALIAS FOR $2;
BEGIN 
      FOR mon_record IN
      FOR compteur IN 1..20 Loop
        EXECUTE '
          (Select s.csa_id, s.csa_matricule, s.csa_nom, s.csa_prenom, k.rab_libelle_gipssi,
          To_char (ap.apa_act_date, ''DD/MM/YYYYA'') as date_abs,
          To_char (ap.apa_act_date, ''YYYY'') as date_acquisition
          From com_salaries s, act_prevision_activites ap, ref_abs_gipssi_kronos k
          where ap.apa_csa_id = s.csa_id
          and EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
          And EXTRACT(MONTH FROM ap.apa_act_date) =' || quote_literal($2) || '
          And ap.apa_act_am = k.rab_code_kronos
          And k.rab_id = compteur
          And s.csa_mode_facture = 0

          UNION

          Select s.csa_id, s.csa_matricule, s.csa_nom, s.csa_prenom, k.rab_libelle_gipssi,
          To_char (ap.apa_act_date, ''DD/MM/YYYYP'') as date_abs,
          To_char (ap.apa_act_date, ''YYYY'') as date_acquisition
          From com_salaries s, act_prevision_activites ap, ref_abs_gipssi_kronos k
          where ap.apa_csa_id = s.csa_id
          and EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
          And EXTRACT(MONTH FROM ap.apa_act_date) =' || quote_literal($2) || '
          And ap.apa_act_pm = k.rab_code_kronos
          And k.rab_id = compteur
          And s.csa_mode_facture = 0)'
          END Loop;
          LOOP
            RETURN NEXT mon_record ;
          END LOOP;
      RETURN;    
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

#77 PL/pgSQL » Union Multiple » 05/11/2010 12:48:51

baradji
Réponses : 12

Bonjour,
j'ai plusieurs union a faire dans une fonction pl-pgsql.
je ne sais pas comment simplifier le code.
pour le moment, ca marche car je fais l'union de tous les select.mais par le futur ,on risque de perdre des infos car le nombre peut augmenter.
j'aimerai savoir simplifier ce code en utilisant une boucle pour trouver le nombre d'element.

voici le code

CREATE OR REPLACE FUNCTION "public"."absence_export_fonc1" (integer,integer)
RETURNS SETOF "public"."absence_export_type1" AS
$body$
DECLARE
mon_record absence_export_type1;
annee ALIAS FOR $1;
mois ALIAS FOR $2;
BEGIN
FOR mon_record IN
EXECUTE '
(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 1),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 1))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 2),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 2))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 3),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 3))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 4),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 4))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 5),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 5))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 6),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 6))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 7),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 7))

UNION ALL

(SELECT s.csa_id, s.csa_matricule,s.csa_nom,s.csa_prenom,
(SELECT rab_libelle_gipssi FROM ref_abs_gipssi_kronos WHERE rab_id = 8),
TO_CHAR(ap.apa_act_date,''DD/MM/YYYYA'') AS date_abs,
TO_CHAR(ap.apa_act_date,''YYYY'') AS date_acquisition
FROM com_salaries s
INNER JOIN act_prevision_activites ap ON ap.apa_csa_id=s.csa_id
WHERE EXTRACT(YEAR FROM ap.apa_act_date)=' || quote_literal($1) || '
AND EXTRACT(MONTH FROM ap.apa_act_date)=' || quote_literal($2) || '
AND ap.apa_act_am = (SELECT rab_code_kronos FROM ref_abs_gipssi_kronos WHERE rab_id = 8))'
LOOP
RETURN NEXT mon_record ;
END LOOP;
RETURN;
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;
-------------------------------
rab_id se trouve dans la table ref_abs_gipssi_kronos. on doit parcourir ce champs de 1 à 8.
je ne sais pas comment simplifier ce code avec les UNION.

Merci à celui ou celle qui pourra me donner un coup de pouce

#78 Re : Général » [Aide] Ecriture d'une fonction "simple" » 06/08/2010 17:11:48

Pour chaque insert ou salect, il faut utiliser une boucle for.
j'espere que ce script pourra t'aider, j'ai supprimé la requete car confidentielle.
mais n'hesite pas à me soliciter en cas de difficulté.

CREATE OR REPLACE FUNCTION fat_export_fonc(INT, "text", "text")
  RETURNS SETOF fat_export_type  AS
$BODY$
DECLARE
  mon_record fat_export_type;
BEGIN
FOR mon_record IN
EXECUTE 'SELECT ...............................................';
LOOP
RETURN NEXT mon_record ;
END LOOP;
RETURN;
END $BODY$
LANGUAGE 'plpgsql';

#79 Général » Fonction plpgsql avec connexion dans une base de données Oracle » 06/08/2010 17:00:39

baradji
Réponses : 1

Salut.
J'ai mis en place une fonction en utilisant plpgsql pour afficher un select.
certaines informations que je souhaite afficher se trouvent dans une base distante sur oracle.
Serait il possible de faire apelle à oracle pour recuperer ces infos et les utiliser dans mon select.

Merci

#80 Re : Général » Recherche enregistrement dans toutes les tables » 06/08/2010 16:55:00

Oui, c'est bien la difficulté.
j'ai une base avec 129 tables et chaque table contient environ 20 champs.
je ne peut pas chercher un à un dans les tables l'information.
je cherche par exemple a determiner l'emplacement du champs "gare_bus", mais je ne connais ni la table, ni le champs.
une 2e question est aussi que le champ contenant l'enregistrement contient la chaine "projet".
Serait il possible de trouver ce champs dans la base sans regarder les tables une à une?

Merci

#81 Général » Recherche enregistrement dans toutes les tables » 06/08/2010 16:16:57

baradji
Réponses : 3

Bonjour,
Je cherche à savoir dans quelle champs et dans quelle table appartient un enregistrement.
Existe t'il une fonction dans postgresql me permettant ceci?

Merci

Pied de page des forums

Propulsé par FluxBB