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

#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

Pied de page des forums