Maison >base de données >tutoriel mysql >Comment définir correctement les fonctions PostgreSQL renvoyant des types d'enregistrement ou composites ?

Comment définir correctement les fonctions PostgreSQL renvoyant des types d'enregistrement ou composites ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 10:57:40726parcourir

How to Correctly Define PostgreSQL Functions Returning Record or Composite Types?

PostgreSQL : ERREUR : 42601 : une liste de définitions de colonnes est requise pour les fonctions renvoyant "record"

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

Renvoyer les colonnes sélectionnées

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);

Renvoyer (un ensemble de) lignes entières

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$;

Renvoyer la ligne entière plus un ajout personnalisé

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn