Stored Function (함수) - 사용자 정의 함수

2022. 4. 26. 21:13DataBase

함수 

1. 함수의 특징 
- 내장함수가 사용자를 만족하는 모든 함수를 제공하지 않아 필요에 의해 사용자가 직접 함수를 만들어서 사용
- 형태와 사용 용도에 프로시저와 차이가 있음

2. 함수의 단점 
유지 보수 복잡성 증가
  ▶ 애플리케이션의 설치나 배포가 더 복잡해짐
       (각 기능을 담당하는 프로그램 코드가 자바와 MySQL 스토어드 프로그램으로 분산되어 관리하기 때문에)

 

 

 

 

사용자 정의 함수 vs 프로시저

  사용자 정의 함수 프로시저
파라미터 모두 입력 파라미터로 사용
(파라미터 in, out를 사용할 수 없다.)
 
리턴값 하나의 값을 반환해야 한다
(함수는 하나이상의 값X)
반환하는 구문X
(out파라미터 사용)
호출 DML 문장 안에서 사용
(함수는 SELECT 문장 안에서 호출)
CALL로 실행 및 호출
DML SELECT 문장이 없고
순수 변수와 알고리즘 로직 뿐이다.
        (           *  - 여러개X,                     
    member.id - 하나의 결과값만 )
SELECT 문장 사용 가능

 

 

 

 

사용자 함수 정의

 

 

 

사용자 정의 함수 실습

프로시저와 동일하게 (데이터베이스 우클릭 - 새로 생성 - 저장루틴) 클릭시 stored program 사용이 가능

유형부분에서 함수를 선택하고, 반환값에 타입을 입력해준 후 루틴 본문의 BEGIN ~ END 사이에 작성

입력값 또한 프로시저와 동일하게 매개변수 탭에서 지정

쿼리에서 호출하여 사용할 때 select 문장으로 호출하고 값을 입력

 

1. 새로 생성 -> 저장루틴

프로시저와 동일하게 (데이터베이스 우클릭 - 새로 생성 - 저장루틴) 클릭시 stored program 사용이 가능

 

유형부분에서 함수를 선택하고, 반환값에 타입을 입력해준 후 루틴 본문의 BEGIN ~ END 사이에 작성

 

3. 매개변수 intValue1(INT), intValue2(INT) 2개 추가

입력값 또한 프로시저와 동일하게 매개변수 탭에서 지정

 

BEGIN
	/*  두 수의 합계 */
	declare total int default 0;
	/* EX: 100과 200의 합계는 300입니다. */
	declare result varchar(500) default '';
	
	set total := intValue1 + intValue2;
	
	set result := concat(intValue1, '과', intValue2, '의 합계는 ', total, '입니다.');
	
	return result;
END

4. 루틴 본문을 위와 같이 입력한 뒤 -> 루틴실행 또는 쿼리실행(SELECT `sf_sum`('100', '200');)

쿼리에서 호출하여 사용할 때 select 문장으로 호출하고 값을 입력

 

 

1. 유형 : 함수(결과반환), 반환 : VARCHAR(20)

2. 매개변수 jumin(VARCHAR(20)) 1개 추가

BEGIN
	/* 성별결과*/
	DECLARE resultGender VARCHAR(20) DEFAULT '';
	/* 주민등록번호 8번짜리 자리 */
	DECLARE genderCheck INT;
	
	IF (LENGTH(jumin) <> 14) THEN 
		SET resultGender := '주민등록번호의 형식이 맞지않습니다.';
	ELSE 
		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. 루틴 본문을 위와 같이 입력한 뒤 -> 루틴실행 클릭 -> 값 입력 후 확인

3. 루틴 본문을 위와 같이 입력한 뒤 -> 쿼리실행(SELECT `sf_gender`('900101-2234567');)

 

 

BEGIN
	/* 만나이결과*/
	DECLARE resultAge VARCHAR(20) DEFAULT '';
	/* 주민등록번호 8번짜리 자리 */
	DECLARE genderCheck INT;
	/* 생년월일 */
	DECLARE birth INT;
	/* 만나이*/
	DECLARE age INT;
	
	IF (LENGTH(jumin) <> 14) THEN 
		SET resultAge := '주민등록번호의 형식이 맞지않습니다.';
	ELSE 
		SET genderCheck := CAST(SUBSTR(jumin,8,1) AS UNSIGNED);
		IF(genderCheck < 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

SELECT `sf_age`('900101-2234567');