본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] CREATE OR REPLACE FUNCTION 함수명()

-- ■■■■ 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