首頁 > 資料庫 > mysql教程 > 如何正確定義傳回記錄或複合類型的 PostgreSQL 函數?

如何正確定義傳回記錄或複合類型的 PostgreSQL 函數?

Barbara Streisand
發布: 2025-01-05 10:57:40
原創
683 人瀏覽過

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

PostgreSQL:錯誤:42601:傳回「記錄」的函數需要列定義清單

錯誤「錯誤: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 會自動為每個表定義一個同名的複合類型。 >「神奇」在於函數呼叫中,我們(可選)分解行類型:

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$;
登入後複製

以上是如何正確定義傳回記錄或複合類型的 PostgreSQL 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板