개발/DB

[Postgresql] function return 값을 table로 보내기

Gamii 2024. 7. 3. 20:02
728x90

 

[상황]

sub_function에서 쿼리를 조회해서 record 형식으로 넘기고 main_function에서 record로 받았더니, record가 문자로 받아지는 현상이 있었다. 

-- sub_function 정의
CREATE OR REPLACE FUNCTION sub_function()
RETURNS record
 LANGUAGE plpgsql
AS $function$
DECLARE
    sub_rec RECORD;
BEGIN
    SELECT id, name into sub_rec
    FROM user_info;
    
    return sub_rec;
END;
$function$;


-- main_function 정의
CREATE OR REPLACE FUNCTION main_function()
RETURNS VOID 
LANGUAGE plpgsql
AS $function$
DECLARE
    rec RECORD;
BEGIN
    select sub_f() into rec;
   
   RAISE NOTICE 'rec : %', rec;    -- 결과 ->  rec : ("(1,Alice)")
   --RAISE NOTICE 'id: %, name: %', rec.id, rec.name;
END;
$function$ ;

 

 

 

문자열이여서 rec.id , rec.name을 호출하면 아래처럼 에러가 발생한다.

 

 

 

 

 

 

 

[해결]

record가 아니라 table 형식으로 코드를 수정하였다. 

-- sub_function 정의
CREATE OR REPLACE FUNCTION sub_function()
RETURNS TABLE (id INT, name TEXT) 
 LANGUAGE plpgsql
AS $function$
BEGIN
    RETURN QUERY
    SELECT id, name
    FROM user_info;
END;
$function$;


-- main_function 정의
CREATE OR REPLACE FUNCTION main_function()
RETURNS VOID 
LANGUAGE plpgsql
AS $function$
DECLARE
    rec RECORD;
BEGIN
    -- sub_function 호출하여 반환된 레코드를 rec에 저장
    FOR rec IN SELECT * FROM sub_function() LOOP
        -- rec의 필드를 사용하여 작업 수행
        RAISE NOTICE 'id: %, name: %', rec.id, rec.name;
    END LOOP;
END;
$function$ ;

 

1. table 형식을 record로 받아올 수 있다

 

2. raw 한 줄에 id와 name 컬럼이 있는데 rec.id, rec.name 이렇게 호출해서 값을 사용하면 된다.

 

 

 

 

 

 

[결과]

--function 호출
select main_function();