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