Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 29/09/2015 11:24:24
- fbamiere@yahoo.com
- Membre
Appel d'une fonction PL/pgSQL qui renvoie plusieurs valeurs
Bonjour,
je me permets de faire un post sur la manière d'écrire une fonction qui renvoie plusieurs valeurs dans un record, et la manière de récupérer ces valeurs :
- avec psql,
- avec une fonction PL/pgSQL
- avec un programme C écrit en ecpg.
J'ai un peu galéré pour y arriver (je comprends .... lentement), je me dis que cela pourrait servir à d'autres, alors voici l'exemple.
A exécuter sur psql :
\echo -- ------------------------------
\echo -- creation de la fonction qui renvoie un record
\echo -- contenant 2 parametres :
\echo -- po_number bigint
\echo -- po_coderet bigint
\echo -- ------------------------------
CREATE OR REPLACE FUNCTION zz0001t_seq(
pi_classe text,
pi_nbre bigint DEFAULT 1)
RETURNS record AS
$BODY$
DECLARE
ret RECORD;
po_number bigint;
po_coderet bigint;
BEGIN
-- doing some stuff...
po_number:=23456;
po_coderet:=12;
-- je retourne 2 parametres valorises dans un record (bigint,bigint)
ret := (po_number,po_coderet);
return ret;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
\echo -- -----------------------------------------
\echo -- appel de la fonction avec psql pour test
\echo -- -----------------------------------------
select N_NUMBER, TS_CODE_RETOUR
FROM zz0001t_seq('ENIMODIFCL',1)
AS (N_NUMBER bigint, TS_CODE_RETOUR bigint)
\echo -- ------------------------------
\echo -- creation de la fonction qui va appeler une autre fonction PL/pgSQL
\echo -- et afficher les 2 parametres
\echo -- ------------------------------
CREATE OR REPLACE FUNCTION zz0001t_appel ()
RETURNS void
as
$BODY$
DECLARE
WS_IDENT bigint;
WS_CODERET bigint;
ret RECORD;
BEGIN
-- Recuperer identifiant systeme
select N_NUMBER, TS_CODE_RETOUR
FROM zz0001t_seq('ENIMODIFCL',1)
AS (N_NUMBER bigint, TS_CODE_RETOUR bigint)
INTO WS_IDENT, WS_CODERET;
-- Affichage
RAISE INFO 'sequence lue %',WS_IDENT;
RAISE INFO 'Code retour %',WS_CODERET;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
\echo -- ------------------------------
\echo -- appel de la fonction
\echo -- ------------------------------
select zz0001t_appel();
L'exécuton sur pgsql donne ceci :
idev05=> \i demo_2_param_out.sql
-- ------------------------------
-- creation de la fonction qui renvoie un record
-- contenant 2 parametres :
-- po_number bigint
-- po_coderet bigint
-- ------------------------------
CREATE FUNCTION
-- -----------------------------------------
-- appel de la fonction avec psql pour test
-- -----------------------------------------
n_number | ts_code_retour
----------+----------------
23456 | 12
(1 ligne)
-- ------------------------------
-- creation de la fonction qui va appeler une autre fonction PL/pgSQL
-- et afficher les 2 parametres
-- ------------------------------
CREATE FUNCTION
-- ------------------------------
-- appel de la fonction
-- ------------------------------
psql:demo_2_param_out.sql:66: INFO: sequence lue 23456
psql:demo_2_param_out.sql:66: INFO: Code retour 12
zz0001t_appel
---------------
(1 ligne)
Pour l'appel en ecpg,l'écriture est la suivante :
EXEC SQL SELECT a, b INTO :N_NUMBER,:TS_CODE_RETOUR
FROM zz0001t_seq(:N_CLASS,:N_INCREMENT)
AS (a bigint, b bigint);
voila, j'espère que je n'ai pas dit trop de bêtises, si vous avez plus simple, je suis preneur.
Fred
Hors ligne