ホームページ > データベース > mysql チュートリアル > レコード型または複合型を返す PostgreSQL 関数を正しく定義するにはどうすればよいですか?

レコード型または複合型を返す PostgreSQL 関数を正しく定義するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-05 10:57:40
オリジナル
680 人が閲覧しました

How to Correctly Define PostgreSQL Functions Returning Record or Composite Types?

PostgreSQL: エラー: 42601: "record" を返す関数には列定義リストが必要です

エラー「エラー: 42601: 列定義リストが必要です」 "record"" を返す関数は、レコード タイプを返すように宣言された関数が、その戻り値で指定された列定義リストを持たないことを示します。ステートメント。

選択した列を返します

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$;
ログイン後にコピー

呼び出し:

SELECT * FROM get_user_by_username('myuser', true);
ログイン後にコピー

行全体 (のセット) を返します

すべてを返すには既存のテーブルのユーザーの列を削除するには、より簡単な方法があります。 Postgres は、すべてのテーブルに対して同じ名前の複合タイプを自動的に定義します。 RETURNS SETOF ユーザーを使用してクエリを大幅に簡素化するだけです。

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$;
ログイン後にコピー

行全体とカスタムの追加を返します

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$;
ログイン後にコピー

「魔法」は関数呼び出しにあり、ここで (オプションで)行の型を分解します:

SELECT (users_row).*, custom_addition FROM get_user_by_username('foo', true);
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート