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

+ Recent posts