-- ■■■■ FUNCTION(함수) ■■■■■
-- 1. 함수란 하나 이상의 PL/SQL 문으로 구성된 서브루틴으로
-- 코드를 다시 사용할 수 있도록 캡슐화 하는데 사용된다.
-- 오라클에서는 오라클에 정의된 기본 제공 함수를 사용하거나
-- 직접 스토어드 함수를 만들 수 있다.(→ 사용자 정의 함수)
-- 이 사용자 정의 함수는 시스템 함수처럼 쿼리에서 호출하거나
-- 저장 프로시저처럼 EXECUTE 문을 통해 실행할 수 있다,
--2. 형식 및 구조
/*
CREATE [OR REPLACE] FUNCTION 함수명
[(
매개변수1 자료형
, 매개변수2 자료형
)]
RETURN 데이터타입
IS
-- 주요 변수 선언(지역 번수)
BEGIN
--실행문;
...
RETURN 값;
[EXCEPTION]
--예외 처리 구문;
END;
*/
-- ※ 사용자 정의 함수(스토어드 함수)는 IN 파라미터(입력 매개변수)만
-- 사용할 수 있으며 반드시 반환될 값의 데이터타입을 RETURN 문에 선언해야
-- 하고 FUNCTION 은 반드시 단일 값만 반환한다.
--● TBL_INSA 테이블을 대상으로 주민번호를 가지고 성별을 조회한다.
SELECT NAME, SSN, DECODE(SUBSTR(SSN,8,1),'1','남자','2','여자','확인불가')"성별"
FROM TBL_INSA;
/*
홍길동 771212-1022432 남자
이순신 801007-1544236 남자
이순애 770922-2312547 여자
김정훈 790304-1788896 남자
한석봉 811112-1566789 남자
이기자 780505-2978541 여자
장인철 780506-1625148 남자
김영년 821011-2362514 여자
나윤균 810810-1552147 남자
김종서 751010-1122233 남자
유관순 801010-2987897 여자
정한국 760909-1333333 남자
조미숙 790102-2777777 여자
황진이 810707-2574812 여자
이현숙 800606-2954687 여자
이상헌 781010-1666678 남자
엄용수 820507-1452365 남자
이성길 801028-1849534 남자
:
:
*/
-- ● FUNCTION 생성
-- 함수명 : FN_GENDER()
↑ SSN(주민등록번호) ▶ 'YYMMDD-NNNNNNN'
CREATE OR REPLACE FUNCTION FN_GENDER
(
)
RETURN ....
IS
BEGIN
END;
-------------------------------
CREATE OR REPLACE FUNCTION FN_GENDER
(
VSSN VARCHAR2 -- 매개변수 : 자릿수(길이) 지정 안함 VARCHAR2(20) X
)
RETURN VARCHAR2 -- 반환자료형 : 자릿수(길이) 지정 안함
IS
-- 주요 변수 선언
BEGIN
-- 연산 및 처리
-- 최종 결과값 반환
END;
----------------------------------
CREATE OR REPLACE FUNCTION FN_GENDER
(
VSSN VARCHAR2 -- 매개변수 : 자릿수(길이) 지정 안함 VARCHAR2(20) X
)
RETURN VARCHAR2 -- 반환자료형 : 자릿수(길이) 지정 안함
IS
-- 주요 변수 선언
VRESULT VARCHAR2(20);
BEGIN
-- 연산 및 처리
IF( SUBSTR(VSSN,8,1) IN ('1','3'))
THEN VRESULT := '남자';
ELSIF (SUBSTR(VSSN,8,1) IN ('2','4'))
THEN VRESULT := '여자';
ELSE
VRESULT := '성별확인불가';
END IF;
-- 최종 결과값 반환
RETURN VRESULT;
END;
--==>Function FN_GENDER이(가) 컴파일되었습니다.
-- ● 생성한 함수(FN_GENDER()) 가 제대로 작동하는지의 여부 확인
SELECT '960000-2222222' "주민번호", FN_GENDER('960000-2222222')"성별확인"
FROM DUAL;
SELECT NAME, SSN, FN_GENDER(SSN) "함수호출결과"
FROM TBL_INSA;
/*
NAME SSN 함수호출결과
홍길동 771212-1022432 남자
이순신 801007-1544236 남자
이순애 770922-2312547 여자
김정훈 790304-1788896 남자
한석봉 811112-1566789 남자
이기자 780505-2978541 여자
장인철 780506-1625148 남자
:
:
*/
--● 임의의 정수 두 개를 매개변수(입력 파라미터)로 넘겨받아
-- A의 B승의 값을 반환하는 사용자 정의 함수를 작성한다,
-- 함수명 : FN_FOW()
/*
사용 예)
SELECT FN_POW(10,3)
FROM DUAL;
--==>> 1000
*/
CREATE OR REPLACE FUNCTION FN_POW
(
VNUM NUMBER -- 매개변수 : 자릿수(길이) 지정 안함 VARCHAR2(20) X
,VPOW NUMBER
)
RETURN NUMBER -- 반환자료형 : 자릿수(길이) 지정 안함
IS
-- 주요 변수 선언
VRESULT NUMBER(5) := 1; -- 그냥 임의로 자릿수 지정했음
N NUMBER :=1;
BEGIN
-- 연산 및 처리
FOR N IN 1..VPOW LOOP
VRESULT := VRESULT * VNUM;
END LOOP;
RETURN VRESULT;
-- 최종 결과값 반환
END;
/*오류(31,9): PLS-00363: expression 'VNUM' cannot be used as an assignment target*/
-- 계속 이오류가 뜨고 되지를 않는다 ㅠㅠㅠ
--VNUM 을 매개변수로 받는건데 내가 실행부에서 VNUM에다가 VNUM*VNUM 값을 넣으려고해서 그랬던거였엉
--VNUM은 사용자가 입력하면 계속 그대로 가야되는건데 그걸 지역변수처럼 바꾸려고해서
--==>>Function FN_POW이(가) 컴파일되었습니다.
------------------------------------------------------------------------------
-- ● 생성한 함수 FN_POW 가 제대로 작동하는지의 여부 확인
SELECT FN_POW(10,4)
FROM DUAL;
--==>>10000
SELECT FN_POW(5,3)
FROM DUAL;
--==>>125
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] DML │ DDL │ DCL │ TCL │ 정적/동적PLSQL (0) | 2021.04.09 |
---|---|
[ ORACLE ] CREATE OR REPLACE PROCEDURE 프로시저명 (0) | 2021.04.09 |
[ ORACLE ] 자료형 참조하는 %TYPE 퍼센트타입 │ %ROWTYPE 로우퍼센트타입 (0) | 2021.04.09 |
[ ORACLE ] 반복문 3가지 │ LOOP │ WHILE LOOP │ FOR LOOP (0) | 2021.04.09 |
[ ORACLE ] PL / SQL (0) | 2021.04.08 |