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