CREATE [ OR REPLACE ] FUNCTION
이름 ( [ [ 인자모드 ] [ 인자이름 ] 인자자료형 [ { DEFAULT | = } 기본값표현식 ] [, ...] ] )
[ RETURNS 반환자료형
| RETURNS TABLE ( 칼럼이름 칼럼자료형 [, ...] ) ]
{ LANGUAGE 언어이름
| TRANSFORM { FOR TYPE 자료형이름 } [, ... ]
| WINDOW
| IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| PARALLEL { UNSAFE | RESTRICTED | SAFE }
| COST 실행비용
| ROWS 반환로우수
| SUPPORT support_function
| SET 환경설정_매개변수 { TO 값 | = 값 | FROM CURRENT }
| AS '정의'
| AS '오브젝트파일', '링크_심벌'
} ...
연습 겸 아주 간단한 함수를 만들어본다.
test_function 테이블을 생성한다.
이번 달 날짜와 다음 달 날짜가 test_function에 insert 되도록 하는 함수 생성
만들고 나니 사실상 함수에 넣는 파라미터는 아무 역할도 하지 못한다 ;;
-- test_function 테이블 생성
create table test_function (
start_date varchar,
end_date varchar
) ;
-- test_func 함수 생성
create or replace function test_func(
date varchar)
returns void as
$$
declare
v_curdate varchar ;
v_nextdate varchar ;
begin
select to_char(now(), 'YYYYMM') into v_curdate ;
select to_char(now() + '1 month', 'YYYYMM') into v_nextdate ;
insert into test_function(start_date, end_date) values (v_curdate, v_nextdate);
end ;
$$
language plpgsql ;
-- test_func 함수 실행
select test_func(to_char(now(), 'YYYYMM')) ;
-- test_function 테이블에 적재여부 확인
select * from test_function ;
start_date | end_date
------------+----------
202304 | 202305
(1 row)
elapse 테이블을 생성한다.
날짜를 입력하면 오늘 날짜와 며칠 간의 차이가 발생하는지 elapse 테이블에 insert하는 함수 생성
이번에는 함수에 넣는 파라미터값을 기준으로 오늘과 날짜를 비교한다.
-- elapse 테이블 생성
create table elapse(
date varchar,
duration varchar);
-- test_func 함수 생성
create or replace function test_func(
date varchar)
returns void as
$$
declare
v_curdate timestamp ;
v_randate timestamp ;
begin
select now() into v_curdate ;
select to_timestamp(date, 'YYYYMMdd') into v_randate ;
if v_curdate > v_randate then
insert into elapse(date, duration) values (to_char(v_curdate,'YYYYMMdd'), to_char(v_curdate - v_randate,'YYYYMMdd'));
elseif v_curdate < v_randate then
insert into elapse(date, duration) values (to_char(v_curdate,'YYYYMMdd'), to_char(v_randate - v_curdate, 'YYYYMMdd'));
else
insert into elapse(date, duration) values (to_char(v_curdate,'YYYYMMdd'), '0') ;
end if;
end ;
$$
language plpgsql ;
-- test_func 함수 실행
select test_func('20020201') ;
-- elapse 테이블 조회
select * from elapse ;
date | duration
----------+------------
20230418 | 0000007746
(1 row)
cf) 함수 조회
\df