L'erreur "ERREUR : 42601 : une liste de définitions de colonnes est requise pour les fonctions renvoyant "record"" indiquent qu'une fonction déclarée pour renvoyer un type d'enregistrement n'a pas de liste de définitions de colonnes spécifiée dans son retour
CREATE OR REPLACE FUNCTION get_user_by_username(_username text , _online bool DEFAULT false) RETURNS TABLE ( user_id int , user_name varchar , last_activity timestamptz ) LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp -- ts with time zone WHERE u.user_name = _username RETURNING u.user_id , u.user_name , u.last_activity; ELSE RETURN QUERY SELECT u.user_id , u.user_name , u.last_activity FROM users u WHERE u.user_name = _username; END IF; END $func$;
Appeler :
SELECT * FROM get_user_by_username('myuser', true);
Pour tout renvoyer colonnes des utilisateurs de la table existante, il existe un moyen plus simple. Postgres définit automatiquement un type composite du même nom pour chaque table. Utilisez simplement les utilisateurs RETURNS SETOF pour simplifier considérablement la requête :
CREATE OR REPLACE FUNCTION get_user_by_username(_username text , _online bool DEFAULT false) RETURNS SETOF users LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp WHERE u.user_name = _username RETURNING u.*; ELSE RETURN QUERY SELECT * FROM users u WHERE u.user_name = _username; END IF; END $func$;
CREATE OR REPLACE FUNCTION get_user_by_username3(_username text , _online bool DEFAULT false) RETURNS TABLE ( users_row users , custom_addition text ) LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp -- ts with time zone WHERE u.user_name = _username RETURNING u -- whole row , u.user_name || u.user_id; ELSE RETURN QUERY SELECT u, u.user_name || u.user_id FROM users u WHERE u.user_name = _username; END IF; END $func$;
La "magie" est dans l'appel de fonction, où nous (facultatif) décomposer le type de ligne :
SELECT (users_row).*, custom_addition FROM get_user_by_username('foo', true);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!