Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 24/07/2012 15:41:57
- HackuH
- Membre
[Résolu] Comment extraire des champ d'un type record
Bonjour,
J'aurais besoin d'aide concernant un petit soucis de sortie d'informations, je m'explique :
J'ai une fonction qui prend en paramètre un entier et qui me retourne une table.
Puis je fais une requête appelant cette fonction et cela me retourne un record pour chaque tuple.
Est-il possible d'obtenir le même affichage que le résultat de ma fonction initiale ?
Merci de votre aide.
Ci-dessous les différents morceau de code (bon, on dira rien sur l'optimisation ... :-) ):
la fonction :
CREATE OR REPLACE FUNCTION "POUET"(IN _idrejet integer DEFAULT (-1))
RETURNS TABLE("1" integer, "2" integer, "3" integer, "DTE" date, "A CLOTURER" boolean) AS
$BODY$
/************************************************************
CTE
************************************************************/
with
_lst_adh as (
select
reg."ADH" as "1",
rel."ADH" as "2"
from
"REJET" rej
join "RGLT" reg using ("REGL")
join "RELAT" rel on rel."ADH_1" = reg."ADH"
where
CASE when $1 = -1 THEN rej."DTREJ" =(select max("DTREJ") from "ADH_REJET")
ELSE rej."IDREJ" = $1 end
),
/************************************************************
écéhance(s) due(s)
************************************************************/
_lst_ech_due as (
select
distinct *,("AN"||'-'||"MOIS"||'-01')::date as "DTE"
from
_lst_adh
join "ECHE" ech using ("IDADH")
where
"SOLDE"("IDECH") > 0
),
/************************************************************
4 echeances consécutives rejetées
************************************************************/
_lst_4_ech_due_consecutives as (
select "1","2","3",min("DTE") as "DTE"
from _lst_ech_due a
where
("DTE" - interval '1 month')::date in (select "DTE" from _lst_ech_due where "1"=a."1" and "2"=a."2" and "3"= a."3")
and ("DTE" - interval '2 month')::date in (select "DTE" from _lst_ech_due where "1"=a."1" and "2"=a."2" and "3"= a."3")
and ("DTE" - interval '3 month')::date in (select "DTE" from _lst_ech_due where "1"=a."1" and "2"=a."2" and "3"= a."3")
group by "1","2","3"
order by "1","2","3","DTE")
/************************************************************
resultat
************************************************************/
select "1","2","3",min("DTE") as "DTE" ,false as "A CLOTURER"
from _lst_ech_due a
where (select count(*) from _lst_4_ech_due_consecutives where "1"=a."1" and "2"=a."2" and "3"= a."3") = 0
GROUP BY "1","2","3"
union
select *,true from _lst_4_ech_due_consecutives
order by "1","2","3";
la requête qui m'embête :
select "POUET"("IDREJET") from "ADH_REJET" where "DTREJ" = '2012-06-26'
Dernière modification par HackuH (25/07/2012 10:37:28)
Hors ligne
#2 24/07/2012 21:31:47
- gleu
- Administrateur
Re : [Résolu] Comment extraire des champ d'un type record
Une solution rapide serait de faire ceci :
SELECT * FROM (select "POUET"("IDREJET") from "ADH_REJET" where "DTREJ" = '2012-06-26') tmp;
Ou, à partir de la 8.4 :
WITH tmp AS (select "POUET"("IDREJET") from "ADH_REJET" where "DTREJ" = '2012-06-26')
SELECT * FROM tmp;
Guillaume.
Hors ligne
#3 25/07/2012 10:29:13
- HackuH
- Membre
Re : [Résolu] Comment extraire des champ d'un type record
Bonjour,
Merci gleu pour ta réponse.
Cependant, j'avais essayé cette solution mais j'avais le même résulta soit un record.
Ce matin après une bonne petite prise de tête, j'ai trouvé une solution :
select * from "POUET"(all(select (array_accum("IDREJET")) as tst from "REJET" where "DTREJ" = '2012-06-26'))
Bonne journée à tous
HackuH
Hors ligne
#4 25/07/2012 18:04:15
- HackuH
- Membre
Re : [Résolu] Comment extraire des champ d'un type record
Petite information complémentaire : la fonction a également été modifiée pour prendre en entrée un tableau ... désolé pour l'oubli
HackuH
Hors ligne