PostgreSQL

PostgreSQL composite types in SQL queries

DBASeoul 2022. 12. 29. 18:04

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)