개발자 미니민의 개발스터디

[Oracle] 오라클 - 함수 (FUNCTION)

by mini_min
[Oracle]
오라클 - 함수 (FUNCTION)

✔️ 함수 (FUNCTION)

: 사용자가 직접 로직을 구현하여 구현한 함수

: 내장 함수(빌트인 함수)처럼 쿼리에서 호출하거나 EXECUTE 문을 통해 실행 가능

 

-- 기본형식

CREATE OR REPLACE FUNCTION function_name
(
	파라미터명 타입
)
RETURN 데이터 타입
IS

	변수, 상수 선언
BEGIN
RETURN 반환값;
END;
/
💡 함수 목록 확인
SELECT * FROM user_procedures;

-- 함수 실행
SELECT fnSum(100), fnSum(20) FROM dual;

 

 

-- 1에서 시작하는 합 구하기

CREATE OR REPLACE FUNCTION fnSum(
		pNum IN NUMBER
)

RETURN NUMBER
IS
	s NUMBER := 0;
	n NUMBER := 0;
	
BEGIN
	WHILE n < pNum LOOP
		n := n + 1;
		s := s + n;
	END LOOP;

	RETURN s;
	
END;
/

 

 

-- 주민번호로 성별 만들기

CREATE OR REPLACE FUNCTION fnGender
(
		rrn VARCHAR2
)
RETURN VARCHAR2   --리턴은 크기를 명시하지 않는다. 
IS

	s NUMBER(1) ;
	b VARCHAR2(6) := '여자';

BEGIN
	IF LENGTH(rrn) = 14 THEN s := SUBSTR(rrn,8,1);
	ELSIF  LENGTH(rrn) = 13 THEN s := SUBSTR(rrn,7,1);
	ELSE RAISE_APPLICATION_ERROR(-20001, '주민번호 오류');
	END IF;
    
    IF MOD(s,2) = 1 THEN
    b := '남자';
    END IF;

    RETURN b;

END;
/
💡 PL/SQL 에는 decode 가 없다!

주민번호 입력시 '-' 을 같이 입력해서 14글자가 되는 경우와 그렇지 않은 경우(13글자) 모두 IF 절로 처리한다.
디폴트 값은 := 여자 

 

 

-- 주민번호로 생년월일 만들기

CREATE OR REPLACE FUNCTION fnBirth
(
		rrn VARCHAR2
)
RETURN DATE
IS

    s NUMBER(1);
    b VARCHAR2(8);

BEGIN
    IF LENGTH(rrn) = 14 THEN s := SUBSTR(rrn,8,1);
	ELSIF  LENGTH(rrn) = 13 THEN s := SUBSTR(rrn,7,1);
	ELSE RAISE_APPLICATION_ERROR(-20001, '주민번호 오류');
	END IF;

     b := SUBSTR(rrn,1,6);
     
     CASE 
        WHEN s IN (1,2,5,6) THEN b := '19' || b;
        WHEN s IN (3,4,7,8) THEN b := '20' || b;
        ELSE b := '18' || b;
        
        END CASE;
        RETURN TO_DATE(b, 'YYYYMMDD');
END;
/

 

 

-- 주민번호로 나이 만들기

CREATE OR REPLACE FUNCTION fnAge
(
		rrn VARCHAR2
)
RETURN NUMBER
IS
     
BEGIN
 RETURN MONTHS_BETWEEN(SYSDATE, fnBirth(rrn))/12;
END;
/


select empNo, name, rrn, fnGender(rrn), fnbirth(rrn), fnAge(rrn) FROM emp;

 

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기