[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;
'SQL쿼리' 카테고리의 다른 글
[Oracle] 오라클 - PL/SQL 커서(Cursor) / 동적쿼리 (0) | 2022.08.17 |
---|---|
[Oracle] 오라클 - PL/SQL 프로시저 및 함수 문제 (0) | 2022.08.17 |
[Oracle] 오라클 - PL/SQL 프로시저 (SELECT / IN OUT 파라미터) (0) | 2022.08.17 |
[Oracle] 오라클 - PL/SQL 프로시저 (삽입/수정/삭제) (0) | 2022.08.17 |
[Oracle] 오라클 - PL/SQL 제어구조 (IF / CASE / LOOP / WHILE / FOR / CONTINUE) (0) | 2022.08.16 |
블로그의 정보
개발자 미니민의 개발로그
mini_min