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
Libérer: 2025-01-05 10:57:40
original
703 Les gens l'ont consulté

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$;
Copier après la connexion

Appeler :

SELECT * FROM get_user_by_username('myuser', true);
Copier après la connexion

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$;
Copier après la connexion

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$;
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal