> 데이터 베이스 > MySQL 튜토리얼 > 레코드 또는 복합 유형을 반환하는 PostgreSQL 함수를 올바르게 정의하는 방법은 무엇입니까?

레코드 또는 복합 유형을 반환하는 PostgreSQL 함수를 올바르게 정의하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-05 10:57:40
원래의
702명이 탐색했습니다.

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

PostgreSQL: 오류: 42601: "레코드"를 반환하는 함수에 열 정의 목록이 필요합니다.

오류 "ERROR: 42601: 열 정의 목록이 필요합니다. "레코드"를 반환하는 함수는 레코드 유형을 반환하도록 선언된 함수에 해당 반환에 지정된 열 정의 목록이 없음을 나타냅니다. 명령문.

선택한 열 반환

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿