Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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