Maison >base de données >tutoriel mysql >Comment corriger l'erreur PostgreSQL 42601 : « une liste de définitions de colonnes est requise pour les fonctions renvoyant « enregistrement » » ?

Comment corriger l'erreur PostgreSQL 42601 : « une liste de définitions de colonnes est requise pour les fonctions renvoyant « enregistrement » » ?

DDD
DDDoriginal
2025-01-05 15:10:39221parcourir

How to Fix PostgreSQL Error 42601:

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

L'erreur "une colonne une liste de définitions est requise pour les fonctions renvoyant « enregistrement » » indique qu'une fonction définie pour renvoyer un type de données d'enregistrement ne contient pas les noms de colonnes et les types de données dans sa déclaration de retour. Pour résoudre cette erreur, spécifiez les définitions de colonnes dans la clause RETURNING ou utilisez RETURNS SETOF .

Comme démontré dans le code suivant, vous pouvez définir les noms de colonnes et les types de données dans la clause RETURNING :

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

Vous pouvez également utiliser RETURNS SETOF pour renvoyer un ensemble d'enregistrements, où est un type composite qui représente la structure des données renvoyées. Par exemple :

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

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