PostgreSQL

[postgreSQL] Function 구조

DBASeoul 2022. 12. 27. 15:32

postgreSQL에서는 Function과 Store Procedure의 구분이 없다.

- 대략적인 구조
CREATE OR REPLACE FUNCTION 함수이름 (파라미터명 파라미터타입, ....)
RETURNS 리턴타입 // RETURN 타입이 테이블일 경우 TABLE(컬럼명 컬럼타입, ....)
LANGUAGE 사용언어
[COST 최대사용자원(숫자임)]
[VOLATILE, STABLE, IMMUTABLE] // 택1, Function수행에 필요한 Query실행 시 최적화와 관련된 부분.. 
AS
[$[함수의 정의를 지칭할 변수명]$]
//함수정의
DECLARE // 변수 선언 및 정의 
   변수명 변수타입, ....

     BEGIN // 로직시작
        [ IF  조건문  THEN  로직  ELSE  로직  END IF; ]
        [
RAISE 에러알림레벨  'TEXT FORMAT: %'  ,   %에 들어갈변수]
        RETURN 결과값 // RETURN 형이 테이블, 즉 쿼리수행의 결과일 경우 RETURN QUERY EXECUTE 쿼리TEXT
     END; // 로직 끝
[$[함수의 정의를 지칭할 변수명]$]


- 참고
변수의 대입문은 :=
동등의 조건문은 =
문자연 연결은 ||
'의 escape 문자는 '' ( ' * 2)
RETURN TYPE이 변경되면 지웠다가 다시만들어야 한다.

 

CREATE OR REPLACE FUNCTION get_test1m_psy 
( 
	v_id character varying, 
	v_system_id character varying ,
	v_size	integer
) 
RETURNS TABLE  
( 
	id integer,  
	system_id	varchar(100), 
	svc_name	varchar(100) 
) 
LANGUAGE 'plpgsql' 
AS $$ 
BEGIN 
	 v_size  := case when v_size = 0 then  2100000000000 else v_size  end; 

    RETURN QUERY  
	SELECT a.id, a.system_id, a.svc_name
FROM PUBLIC.test1m AS a
WHERE (
		v_id = ''
		OR a.id = ANY (array(SELECT c.id FROM PUBLIC.test2m AS c limit 100))
		)
ORDER BY a.system_id limit v_size;

END; $$