[PostgreSQL] 함수 생성 / CREATE FUNCTION

Ja L·2023년 4월 18일
0

AgensSQL/PostgreSQL

목록 보기
8/37
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 '오브젝트파일', '링크_심벌'
  } ...

연습 겸 아주 간단한 함수를 만들어본다.

case1

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)

case2

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

profile
DB Engineer

0개의 댓글