Vous n'êtes pas identifié(e).
Pages : 1
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
Hors ligne
Ou plus simplement dans ce cas, tu la déclares comme une fonction SQL et non pas une fonction PL/pgsql.
Guillaume.
Hors ligne
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
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
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
euh, j'ai mis 1 en argument mais c'est juste un exemple...
Guillaume.
Hors ligne
Merci ça marche très bien.
Hors ligne
Pages : 1