Maison >base de données >tutoriel mysql >Erreur PostgreSQL 42601 : Comment définir correctement les types de retour pour les fonctions renvoyant des enregistrements ?

Erreur PostgreSQL 42601 : Comment définir correctement les types de retour pour les fonctions renvoyant des enregistrements ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 13:51:40755parcourir

PostgreSQL Error 42601: How to Correctly Define Return Types for Functions Returning Records?

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

Cette erreur se produit lors de la création d'une fonction qui renvoie un enregistrement sans fournir de liste de définitions de colonnes. Cet article expliquera le problème et fournira une solution pour résoudre l'erreur.

Problème

Dans PostgreSQL, les fonctions qui renvoient des enregistrements nécessitent une liste de définitions de colonnes spécifiant explicitement les noms et les types de données des colonnes. dans le dossier retourné. Cependant, le code fourni dans la question tente de renvoyer un enregistrement sans définir les colonnes, ce qui entraîne l'erreur « La liste de définitions de colonnes est requise. »

Solution

Pour résoudre l'erreur, vous devez pour fournir une liste de définitions de colonnes pour le type de retour de la fonction. Cela peut être fait en utilisant le mot-clé RETURNS. Par exemple, voici une version corrigée de la fonction :

CREATE OR REPLACE FUNCTION get_user_by_username(
    username varchar(250),
    online boolean
) RETURNS TABLE (
    user_id int,
    user_name varchar(250),
    last_activity timestamptz
) AS $$
BEGIN
    IF online THEN
        UPDATE users
        SET last_activity = current_timestamp
        WHERE user_name = username;
    END IF;

    RETURN QUERY
    SELECT
        user_id,
        user_name,
        last_activity
    FROM
        users
    WHERE
        user_name = username
    LIMIT 1;
END;
$$ LANGUAGE plpgsql;

Dans ce code, l'instruction RETURNS TABLE spécifie les noms de colonnes et les types de données de l'enregistrement à renvoyer par la fonction.

Vous pouvez également éviter d'utiliser une liste de définitions de colonnes en renvoyant une ou plusieurs lignes entières d'une table existante. Par exemple :

CREATE OR REPLACE FUNCTION get_user_by_username(
    username varchar(250),
    online boolean
) RETURNS SETOF users AS $$
BEGIN
    IF online THEN
        RETURN QUERY
        UPDATE users
        SET last_activity = current_timestamp
        WHERE user_name = username
        RETURNING *;
    ELSE
        RETURN QUERY
        SELECT *
        FROM
            users
        WHERE
            user_name = username;
    END IF;
END;
$$ LANGUAGE plpgsql;

Dans ce cas, l'instruction RETURNS SETOF users indique que la fonction renverra un ensemble de lignes de la table users, qui possède déjà les définitions de colonnes nécessaires.

Assurez-vous que les définitions de colonnes correspondent à la structure réelle de la table pour éviter les erreurs ou les comportements inattendus.

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