postgres retour json à partir d'une fonction
J'ai appris à connaître que je peux utiliser row_to_json de retour json sortie
Par exemple
Si ma requête est:
select * from sample;
Je peux le réécrire comme suit pour le retour json de sortie:
select row_to_json(sample) from sample;
Mais une chose que je suis en train de réaliser est la même fonctionnalité dans la fonction.
Pour vous donner un exemple, ici, est la fonction de retour de la table:
CREATE FUNCTION find_val(val text)
RETURNS SETOF sample AS
$$
BEGIN
RETURN QUERY
SELECT * FROM sample where $1 = ANY(col4);
END;
$$
LANGUAGE 'plpgsql';
Maintenant, au lieu de lignes, je tiens à revenir sortie JSON à partir de ma fonction. Comment puis-je le faire ?
Voici ce que j'ai essayé jusqu'à présent:
native=> CREATE FUNCTION find_val(val text)
RETURNS SETOF sample AS
$$
BEGIN
RETURN QUERY
SELECT row_to_json(sample) FROM sample where $1 = ANY(col4) ;
END;
$$
LANGUAGE 'plpgsql';
CREATE FUNCTION
native=> select find_val('yo');
ERROR: structure of query does not match function result type
DETAIL: Returned type json does not match expected type integer in column 1.
CONTEXT: PL/pgSQL function find_val(text) line 3 at RETURN QUERY
native=> drop function find_val(text);
DROP FUNCTION
native=> CREATE FUNCTION find_val(val text)
native-> RETURNS json AS
native-> $$
native$> BEGIN
native$> SELECT row_to_json(sample) FROM sample where $1 = ANY(col4);
native$> END;
native$> $$
native-> LANGUAGE 'plpgsql';
CREATE FUNCTION
native=> select find_val('yo');
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function find_val(text) line 3 at SQL statement
native=>
Vous devez vous connecter pour publier un commentaire.
Ce n'est rien à voir avec json vs d'autres types de retour. Vous ne pouvez pas utiliser de la plaine
SELECT
dans un fonctions PL/PgSQL, il doit êtreSELECT INTO
,RETURN QUERY SELECT
, ouPERFORM
. Par laHINT
erreur.Dans votre cas, vous avez besoin d'une plaine de la fonction SQL.
CREATE OR REPLACE FUNCTION find_val(val text) RETURNS json AS $$ DECLARE t_row sample%ROWTYPE; BEGIN SELECT * INTO t_row FROM sample where $1 = ANY(col4); RETURN row_to_json(t_row); END; $$ LANGUAGE 'plpgsql';