mysql
delimiter $$
CREATE FUNCTION id_generator() //선언부
RETURNS int //반환 타입 지정
NO SQL // mysql의 특수문법
BEGIN // 함수 body 시작 선언
RETURN (100000 + floor(rand() * 100000));
END //함수 body 종료 선언
$$
delimiter ;
INSERT INTO employee
VALUES(id_generator(),"Kims",'1999-02-12','F','PO',105000,1005);
mysql
delimiter $$
CREATE FUNCTION dept_avg_salary(d_id int) //선언부
RETURNS int //반환 타입 지정
READS SQL // mysql의 특수문법
BEGIN // 함수 body 시작 선언
DECLARE avg_sal int; //변수 선언 DECLARE로 변수 선언할 수 있음
select avg(salary) into avg_sal
from employee
where dept_id = d_id;
RETURN avg_sal;
END //함수 body 종료 선언
$$
delimiter ;
DECLARE로 변수 선언하지 않고, '@'로 반환해도 된다.
select avg(salary) into @avg_sal
from employee
where dept_id = d_id;
RETURN @avg_sal;
해당 함수를 사용하면, 다음처럼 사용할 수 있다.
참고사항 :일반적인 기준은 없다.(쉬운코드님이 실무에서 일하면서 생긴 데이터를 바탕으로 설명) 회사나 개발팀에 따라서 컨밴션이 다 다르다. 컨밴션에 맞게 사용하는게 맞다.
Three-tier architecture
Util 함수로 쓰기에는 적합한듯 하다
비즈니스 로직을 stored function에 두는 것은 비추천한다.
why?
soted function에 비즈니스 로직을 둘 경우 비즈니스 로직의 일부가 Date tier에 있게 되는 것이므로, 프로젝트의 규모가 커지기 시작하면, 비즈니스 로직의 유지보수가 힘들어 진다.(내가 이 로직을 어디에서 구현했는지 까먹는다고 한다..)
mysql
delimiter $$
//IN은 INPUT Parm, OUT 은 OUTPUT Parm
CREATE PROCEDURE product(IN a int, IN b int, OUT result int)
BEGIN
SET result = a * b ;
END
$$
delimiter ;
parameter에 IN인지 OUT인지를 명시하지 않을 경우 Default는 IN이다.
mysql
delimiter $$
//INOUT은 해당 변수가 INPUt이자 OUTPUT임을 의미한다.
CREATE PROCEDURE swap(INOUT a int, INOUT b int)
BEGIN
SET @tmp = a;
SET b = a;
SET b= @tmp;
END
$$
delimiter ;
swap 사용
set @a = 5, @b = 7;
call swap(@a,@b); //프로시저는 call로 호출한다.
select @a,@b;
결과
a = 7, b = 5 가 나온다.
이외에도 RDBMS마다
Ref.
쉬운코드 백발백중