PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 17/12/2008 18:40:54

zied
Membre

Procédure Stockée et Retour de résultats

Bonjour
J'ai écrit la procédure stockée suivante :

DROP FUNCTION _1NomMultiNiveaux2(integer);

CREATE OR REPLACE FUNCTION _1NomMultiNiveaux2(integer)
RETURNS record AS
$BODY$

BEGIN

SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 2 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
                   FROM "NOMENCLATURE" where
                  ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 1 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 0 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)
  ORDER BY 3;

END

$BODY$
  LANGUAGE 'plpgsql'
  COST 100;

quand j'exécute la requête suivante :

select _1nommultiniveaux2(1);

J'ai le message d'erreur suivant :

ERREUR:  query has no destination for result data
ASTUCE : If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXTE : PL/pgSQL function "_1nommultiniveaux2" line 4 at SQL statement

Comment je fais pour que la procédure retourne les enregistrements demandés?
Merci

Hors ligne

#2 18/12/2008 00:01:43

luddic
Membre

Re : Procédure Stockée et Retour de résultats

Bonsoir,

il faut utiliser RETURN et RETURN NEXT:

http://docs.postgresqlfr.org/8.3/plpgsq … -returning

Hors ligne

#3 18/12/2008 10:04:58

gleu
Administrateur

Re : Procédure Stockée et Retour de résultats

Ou plus simplement dans ce cas, tu la déclares comme une fonction SQL et non pas une fonction PL/pgsql.


Guillaume.

Hors ligne

#4 18/12/2008 11:22:43

zied
Membre

Re : Procédure Stockée et Retour de résultats

Bonjour
Merci à tous.
Je vais continuer ma question en 2 fois : Un post pour la cas de PL/PgSQL car je veux comprendre le principe.
Un autre pour le cas d'une procédure SQL. Je veux affiner le type de résultat

1 - PLSQL

J'ai utilisé RETURN QUERY :

CREATE OR REPLACE FUNCTION _1nommultiniveaux2(integer)
  RETURNS SETOF record AS
$BODY$


BEGIN
return query(
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 2 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
                   FROM "NOMENCLATURE" where
                  ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 1 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 0 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)
  ORDER BY 3);
RETURN;

END

$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;

En exécutant
select _1nommultiniveaux2(1);

Le résultat est le suivant :


ERREUR: la fonction avec set-value a été appelé dans un contexte qui n'accepte pas
un ensemble
État SQL :0A000
Contexte : PL/pgSQL function "_1nommultiniveaux2" line 4 at RETURN QUERY




Avez vous une idée?

Dernière modification par zied (18/12/2008 11:31:30)

Hors ligne

#5 18/12/2008 11:25:52

zied
Membre

Re : Procédure Stockée et Retour de résultats

Suite du post Précédent :
2 - cas d'une  procédure SQL




CREATE OR REPLACE FUNCTION _1nommultiniveaux3(integer)
  RETURNS SETOF record AS
$BODY$




SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 2 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
                   FROM "NOMENCLATURE" where
                  ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 1 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IN ( SELECT "NOMENCLATURE"."NMC_ID"
           FROM "NOMENCLATURE"
          WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)))
UNION
SELECT "NOMENCLATURE"."NMC_ID", "NOMENCLATURE"."NMC_PERE", 0 AS niv
   FROM "NOMENCLATURE"
  WHERE ("NOMENCLATURE"."NMC_PERE" IS NULL) and ("NOMENCLATURE"."NMC_ID"=$1)
  ORDER BY 3;
 




$BODY$
  LANGUAGE 'sql' VOLATILE
  COST 100
  ROWS 1000;

J'obtiens un résultat avec des tuples de ce type :

"(1,,0)"
"(2,1,1)"
"(3,1,1)"
"(4,2,2)"

Comment faire pour avoir des colonnes séparées?
Merci

Dernière modification par zied (18/12/2008 11:32:20)

Hors ligne

#6 18/12/2008 18:59:26

gleu
Administrateur

Re : Procédure Stockée et Retour de résultats

1. Tu ne dois pas faire un SELECT tafonction(), mais un SELECT * FROM tafonction() AS tmp(col1 typedecol1, col2 typedecol2);

2. Pareil que 1...

En gros :

select * from _1nommultiniveaux3(1) as tmp (nmc_id integer, nmc_pere integer);

Guillaume.

Hors ligne

#7 18/12/2008 19:02:40

gleu
Administrateur

Re : Procédure Stockée et Retour de résultats

euh, j'ai mis 1 en argument mais c'est juste un exemple...


Guillaume.

Hors ligne

#8 19/12/2008 09:35:11

zied
Membre

Re : Procédure Stockée et Retour de résultats

Merci ça marche très bien.

Hors ligne

Pied de page des forums