ホームページ >データベース >mysql チュートリアル >PostgreSQL エラー 42601:「「レコード」を返す関数には列定義リストが必要です」を修正する方法?

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

DDD
DDDオリジナル
2025-01-05 15:10:39221ブラウズ

How to Fix PostgreSQL Error 42601:

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

エラー「列」 「レコード」を返す関数には定義リストが必要です。」は、レコード データ型を返すように定義された関数に列名が欠落していることを示します。 return ステートメント内のデータ型。このエラーを解決するには、RETURNING 句で列定義を指定するか、RETURNS SETOF を使用します。

次のコードに示すように、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$;

または、RETURNS SETOF を使用することもできます<レコードタイプ>レコードのセットを返します。ここで、返されるデータの構造を表す複合型です。例:

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

以上がPostgreSQL エラー 42601:「「レコード」を返す関数には列定義リストが必要です」を修正する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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