ホームページ >データベース >mysql チュートリアル >PostgreSQL エラー 42601: レコードを返す関数の戻り値の型を正しく定義するにはどうすればよいですか?

PostgreSQL エラー 42601: レコードを返す関数の戻り値の型を正しく定義するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 13:51:40755ブラウズ

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

PostgreSQL: エラー: 42601: 「レコード」を返す関数には列定義リストが必要です

このエラーは、レコードを提供せずにレコードを返す関数を作成するときに発生します。列定義リスト。この記事では、この問題について説明し、エラーを解決する解決策を示します。

問題

PostgreSQL では、レコードを返す関数には、列の名前とデータ型を明示的に指定する列定義リストが必要です。返された記録にあります。ただし、質問で提供されているコードは列を定義せずにレコードを返そうとするため、「列定義リストが必要です」というエラーが発生します。

解決策

エラーを解決するには、次のことが必要です。関数の戻り値の型の列定義リストを提供します。これは RETURNS キーワードを使用して実行できます。たとえば、関数の修正バージョンは次のとおりです。

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;

このコードでは、RETURNS TABLE ステートメントは、関数によって返されるレコードの列名とデータ型を指定します。

あるいは、既存のテーブルの 1 つまたは複数の行全体を返すことで、列定義リストの使用を回避できます。例:

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;

この場合、RETURNS SETOF users ステートメントは、関数が必要な列定義をすでに備えている users テーブルの行のセットを返すことを示します。

エラーや予期しない動作を避けるために、列の定義が実際のテーブル構造と一致していることを確認してください。

以上がPostgreSQL エラー 42601: レコードを返す関数の戻り値の型を正しく定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。