사용자 정의 함수
함수의 특징
- 내장함수가 사용자를 만족하는 모든 함수를 제공하지 않아 , 필요에 의해 사용자가 직접 함수를 만들어서 사용
- 형태와 사용 용도에 프로시저와 차이가 있음
함수의 단점
- 유지 보수 복잡성 증가
- 각 기능을 담당하는 프로그램 코드가 자바와 MySQL Stored Program으로 분산되어 관리되기 때문에 애플리케이션의 설치나 배포가 더 복잡해짐.
사용자 정의 함수 vs. 프로시저
- 파라미터 in, out 을 사용할 수 없다.
- 함수의 파라미터는 모두 입력 파라미터로 사용된다.
- 리턴값이 있다.
- 프로시저는 반환하는 구문이 없지만 (out 파라미터 사용) 함수는 하나의 값을 반환해야 한다.
- 호출이 다르다.
- 함수는 SELECT 문장 안에서 호출된다.
- SELECT를 사용할 수 없다.,
- 프로시저는 SELECT를 사용할 수 있으나 함수는 집합결과를 반환하는 SELECT문을 사용할 수 없다.
사용자 함수 정의
DELIMITER $$
CREATE FUNCTION 스토어드 함수 이름(파라미터)
RETURNS 반환형식
BEGIN
프로그래밍 코딩…
RETURN 반환값 ;
END $$
DELIMITER;
SELECT 스토어드 함수 이름();
사용자 정의 함수 실습 1
사용자 정의 함수 실습 2
주민등록번호를 입력받아 성별을 조회하는 함수를 호출하시오.
BEGIN
DECLARE resultStr VARCHAR(200);
declare str varchar(200);
set str = SUBSTRING(num,8,1);
case
when (str = '1') or (str = '3') or (str = '5') or (str = '7') then
set resultStr = '남자입니다.';
when (str = '2') or (str = '4') or (str = '6') or (str = '8') then
set resultStr = '여자입니다.';
else
set resultStr = '주민등록번호가 옳지 않습니다.';
end case;
RETURN resultStr;
END
사용자 정의 함수 실습 3
주민등록번호를 입력받아 만나이를 조회하는 함수를 호출하시오.
BEGIN
DECLARE result varchar(200);
DECLARE subStrDate int;
DECLARE checkS int;
DECLARE age int;
set subStrDate = SUBSTRING_INDEX(num,'-',1);
set checkS = SUBSTR(SUBSTRING_INDEX(num,'-',-1),1,1);
if(CHAR_LENGTH(num) =14) then
case
when checkS = 1 or checkS = 2 then
set subStrDate = 19000000 + subStrDate;
when checkS = 3 or checkS = 4 then
set subStrDate = 20000000 + subStrDate;
end case;
set age = TRUNCATE(((CONVERT(REPLACE(CURRENT_DATE(),'-',''),UNSIGNED)-subStrDate)/10000),0);
if(result = 'error') then
set result = '잘못 입력된 값입니다.';
else
set result = concat('만', age , '세입니다.');
end if;
else
set result = '입력값이 맞지 않습니다.';
end if;
return result;
END