エラー「エラー: 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 サイトの他の関連記事を参照してください。