type 을 인자로 받고 return 도 type 으로 하기
type 을 인자로 받기때문에 인자의 갯수가 1개이상 늘어나지 않게 할수 있음
인자를 나중에 추가해도 인자갯수가 늘어나지 않음(오버로딩)
한개의 인자를 여러건 검색할경우가 있으므로 in 조건이 들어올 가능성이 있는 항목은 배열 처리
단점 : type 을 삭제 할수 없음
CREATE TYPE test1m_type AS (
id INTEGER
,timeslice TIMESTAMP
,system_id CHARACTER VARYING(100)
,group_id CHARACTER VARYING(100)
,agent_name CHARACTER VARYING(100)
,svc_name CHARACTER VARYING(100)
,count INTEGER
)
CREATE TYPE test1m_Search_type2 AS (
id integer array ,
system_id character varying(100) array
)
SELECT * FROM public.get_test1m_type
(
(
null,
null
)::test1m_Search_type2
)
SELECT * FROM public.get_test1m_type
(
(
array(select c.id::integer from public.test2m as c limit 100),
null, --array['06675','08e9a'],
1,
10000
)::test1m_Search_type2
)
ALTER TYPE test1m_Search_type2 ADD ATTRIBUTE start_id int;
ALTER TYPE test1m_Search_type2 ADD ATTRIBUTE end_id int;
CREATE OR REPLACE FUNCTION public.get_test1m_type(
sch test1m_Search_type2
)
RETURNS SETOF public.test1m_type
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
RETURN QUERY
SELECT *
FROM PUBLIC.test1m AS a
WHERE a.id BETWEEN sch.start_id AND sch.end_id
AND (
sch.id IS NULL
OR a.id = ANY (sch.id)
)
AND (
sch.system_id IS NULL
OR a.system_id = ANY (sch.system_id)
)
ORDER BY a.system_id
limit 1000;
END;
$BODY$;
VARIADIC 형식은 가변인자로써 동일한 데이터 타입의 여러개의 인자들을 한번에 지정할 수 있습니다
CREATE OR REPLACE FUNCTION sum(VARIADIC params numeric[])
RETURNS numeric AS
$$ DECLARE
res numeric := 0;
BEGIN
FOR i IN 1 .. array_length(params, 1) LOOP
res := res + params[i];
END LOOP;
RETURN res;
END; $$
LANGUAGE plpgsql;
--select sum(1,2,3)
'PostgreSQL' 카테고리의 다른 글
DB-Engines Ranking (PostgreSQL) (0) | 2023.01.26 |
---|---|
group by + limit 의 성능 이슈 (0) | 2023.01.17 |
Postgresql 변수 / 바인드 / 매개변수 처리 (0) | 2022.12.28 |
[postgreSQL] Function 구조 (0) | 2022.12.27 |
PostgreSQL 비 결정적 변수에 대한 실행 계획 (1) | 2022.12.26 |