집 >데이터 베이스 >MySQL 튜토리얼 >PostgreSQL 함수에서 결과 세트를 효율적으로 반환하는 방법은 무엇입니까?
PostgreSQL 함수에서 결과 집합 반환
PostgreSQL에서 함수를 작성할 때 결과 집합을 반환해야 하는 경우가 많습니다. 제공된 함수 wordFrequency가 SETOF RECORD 반환 유형으로 올바르게 정의되었습니다. 그러나 현재 구현에는 쿼리 결과를 반환하는 적절한 명령이 부족합니다.
RETURN QUERY
해결책은 다음과 같이 RETURN QUERY 명령을 활용하는 것입니다. 수정된 기능:
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text -- also visible as OUT param in function body , cnt bigint , ratio bigint) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt , count(*) AS cnt -- column alias only visible in this query , (count(*) * 100) / _max_tokens -- I added parentheses FROM ( SELECT t.txt FROM token t WHERE t.chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; -- potential ambiguity END $func$;
RETURN 사용 TABLE
RETURNS TABLE을 사용하여 반환 유형을 명시적으로 정의하면 다음과 같은 여러 가지 이점이 있습니다.
이름 지정 고려 사항
OUT 매개변수 이름을 지정할 때는 함수 본문 전체에 표시되므로 주의하세요. 충돌이나 혼동을 피하려면 동일한 이름을 가진 테이블 열을 정규화하거나 제안된 명명 모범 사례를 따르십시오.
대안
제공된 대체 쿼리는 상대적 점유율을 계산합니다. 토큰별:
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text , abs_cnt bigint , relative_share numeric) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt, t.cnt , round((t.cnt * 100) / (sum(t.cnt) OVER ()), 2) -- AS relative_share FROM ( SELECT t.txt, count(*) AS cnt FROM token t WHERE t.chartype = 'ALPHABETIC' GROUP BY t.txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY t.cnt DESC; END $func$;
이 버전은 창 기능을 사용하며 정확한 상대적 공유를 위한 수치 결과를 보장합니다. 계산.
위 내용은 PostgreSQL 함수에서 결과 세트를 효율적으로 반환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!