2022. 4. 26. 21:13ㆍDataBase
함수
1. 함수의 특징
- 내장함수가 사용자를 만족하는 모든 함수를 제공하지 않아 필요에 의해 사용자가 직접 함수를 만들어서 사용
- 형태와 사용 용도에 프로시저와 차이가 있음
2. 함수의 단점
- 유지 보수 복잡성 증가
▶ 애플리케이션의 설치나 배포가 더 복잡해짐
(각 기능을 담당하는 프로그램 코드가 자바와 MySQL 스토어드 프로그램으로 분산되어 관리하기 때문에)
사용자 정의 함수 vs 프로시저
사용자 정의 함수 | 프로시저 | |
파라미터 | 모두 입력 파라미터로 사용 (파라미터 in, out를 사용할 수 없다.) |
|
리턴값 | 하나의 값을 반환해야 한다 (함수는 하나이상의 값X) |
반환하는 구문X (out파라미터 사용) |
호출 | DML 문장 안에서 사용 (함수는 SELECT 문장 안에서 호출) |
CALL로 실행 및 호출 |
DML | SELECT 문장이 없고 순수 변수와 알고리즘 로직 뿐이다. ( * - 여러개X, member.id - 하나의 결과값만 O ) |
SELECT 문장 사용 가능 |
사용자 함수 정의
사용자 정의 함수 실습
프로시저와 동일하게 (데이터베이스 우클릭 - 새로 생성 - 저장루틴) 클릭시 stored program 사용이 가능
유형부분에서 함수를 선택하고, 반환값에 타입을 입력해준 후 루틴 본문의 BEGIN ~ END 사이에 작성
입력값 또한 프로시저와 동일하게 매개변수 탭에서 지정
쿼리에서 호출하여 사용할 때 select 문장으로 호출하고 값을 입력
프로시저와 동일하게 (데이터베이스 우클릭 - 새로 생성 - 저장루틴) 클릭시 stored program 사용이 가능
▼
유형부분에서 함수를 선택하고, 반환값에 타입을 입력해준 후 루틴 본문의 BEGIN ~ END 사이에 작성
▼
입력값 또한 프로시저와 동일하게 매개변수 탭에서 지정
▼
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
쿼리에서 호출하여 사용할 때 select 문장으로 호출하고 값을 입력
▼
▼
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
▼
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
'DataBase' 카테고리의 다른 글
Transction(트랜잭션) (0) | 2022.04.26 |
---|---|
Stored trigger (트리거) (0) | 2022.04.26 |
Stored Procedure (프로시저) (0) | 2022.04.25 |
데이터베이스 part4 - 정규화, 서브쿼리(Sub Query), UNION, SQL 실습 (0) | 2022.04.25 |
데이터베이스 part3 - JOIN, 데이터베이스 설계, SQL 실습 (0) | 2022.04.24 |