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 29/09/2015 11:24:24

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

Pied de page des forums