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();
'개발 > DB' 카테고리의 다른 글
[Timescaledb] Materialized View로 통계 조회 속도 개선 방법 (0) | 2024.07.26 |
---|---|
[DB] Timescaledb에서 PK와 Unique index 차이점 (0) | 2024.07.16 |
[Timescaledb] Function, Procedure Job 스케줄러 등록 및 확인 방법 (0) | 2024.07.03 |