1. 사용자 정의 함수
1) 함수의 특징
- 내장함수가 사용자를 만족하는 모든 함수를 제공하지 않아 필요에 의해 사용자가 직접 함수를 만들어서 사용
- 형태와 사용 용도에 프로시저와 차이가 있음
2) 함수의 단점
- 유지보수 복잡성 증가
: 애플리케이션의 설치나 배포가 더 복잡해짐(각 기능을 담당하는 프로그램 코드가 분산되어 관리하기 때문에)
3) 사용자 정의 함수와 프로시저의 차이점
1. 파라미터 in, out을 사용할 수 없다.
- 함수의 파라미터는 모두 입력 파라미터로 사용한다.
2. 리턴 값이 필수로 존재해야 한다.
- 프로시저는 반환구문(out파라미터는 사용)이 없어도 되나 함수는 하나의 값을 반환해야 한다.
3. 처리 방식이 다르다
- 함수는 클라이언트 사이드 에서 처리되고 프로시저는 서버사이드에서 처리된다.
따라서 프로시저가 속도 측면에서 유리하다
4. 호출 방식이 다르다
- 프로시저는 CALL로 호출하고 함수는 SELECT 문장안에서 호출된다.
4) 사용자 정의 함수 생성

>>> 프로시저 생성과 동일하나, 유형을 함수로 변경하고 반환 타입을 설정해줘야한다
(VARCHAR의 경우 길이까지 설정해야한다.)
*** 사용자 정의 함수 실습문제 ***
실습문제 1. 두 수를 입력받아 두수의 합을 출력하는 함수를 작성하여라.
▼ 사용자 정의 함수 생성

▼ 루틴 본문 작성
BEGIN
/* 두수의 합계를 담을 변수선언 */
DECLARE total INT DEFAULT 0;
/* 결과값으로 출력될 문자열 변수선언 */
DECLARE result VARCHAR(500) DEFAULT '';
/* 값 SETTING */
SET total := (intValue1+intValue2);
SET result := CONCAT(intValue1,'과 ',intValue2,'의 합계는 ',total,'입니다.');
/* 반환(함수에서는 반환이 필수) */
RETURN result;
END
▼ 결과확인

실습문제 2. 주민등록번호를 입력받아 성별을 조회하는 함수를 작성하고 호출하시오.
▼ 사용자 정의 함수 생성

▼ 루틴 본문 작성
BEGIN
/* 성별결과*/
DECLARE resultGender VARCHAR(20) DEFAULT '';
/* 주민등록번호 8번짜리 자리 */
DECLARE genderCheck INT;
IF (LENGTH(jumin) <> 14) THEN
SET resultGender := '주민등록번호의 형식이 맞지않습니다.';
ELSE
/* 문자열로 입력된 주민번호를 8번째자리를 출력후 숫자로 변환 */
SET genderCheck := CAST(SUBSTR(jumin,8,1) AS UNSIGNED);
IF( (genderCheck % 2) = 0) THEN
SET resultGender := '여성입니다.';
ELSE
SET resultGender := '남성입니다.';
END IF;
END IF;
return resultGender;
END
▼ 결과확인

실습문제 3. 주민등록번호를 입력받아 만 나이를 조회하는 함수를 작성하고 호출하시오.
▼ 사용자 정의 함수 생성

▼ 루틴 본문 작성
BEGIN
/* 만나이결과*/
DECLARE resultAge VARCHAR(20) DEFAULT '';
/* 주민등록번호 8번짜리 자리 */
DECLARE ageCheck INT;
/* 생년월일 */
DECLARE birth INT;
/* 만나이*/
DECLARE age INT;
IF (LENGTH(jumin) <> 14) THEN
SET resultAge := '주민등록번호의 형식이 맞지않습니다.';
ELSE
SET ageCheck := CAST(SUBSTR(jumin,8,1) AS UNSIGNED);
IF(ageCheck < 3) THEN
SET birth := CAST(CONCAT('19',SUBSTRING_INDEX(jumin,'-',1)) AS UNSIGNED);
ELSE
SET birth := CAST(CONCAT('20',SUBSTRING_INDEX(jumin,'-',1)) AS UNSIGNED);
END IF;
SET age := TRUNCATE(((TO_DAYS(NOW()) - (TO_DAYS(birth))) / 365),0);
SET resultAge := CONCAT('만 ', age, '세 입니다.');
END IF;
return resultAge;
END
▼ 결과확인

'DBMS' 카테고리의 다른 글
MySQL - 트랜잭션 (0) | 2023.05.15 |
---|---|
MySQL - 트리거 (0) | 2023.05.15 |
MySQL - 프로시저 (0) | 2023.05.15 |
MySQL 피벗테이블, 그룹콘캣(Group-concat) (0) | 2023.05.15 |
SQL - 서브쿼리 (0) | 2023.05.15 |