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; $$
'PostgreSQL' 카테고리의 다른 글
DB-Engines Ranking (PostgreSQL) (0) | 2023.01.26 |
---|---|
group by + limit 의 성능 이슈 (0) | 2023.01.17 |
PostgreSQL composite types in SQL queries (0) | 2022.12.29 |
Postgresql 변수 / 바인드 / 매개변수 처리 (0) | 2022.12.28 |
PostgreSQL 비 결정적 변수에 대한 실행 계획 (1) | 2022.12.26 |