생각하는 감쟈

[Oracle] SQL_User Defined Function (Function) 본문

Language/Oracle

[Oracle] SQL_User Defined Function (Function)

생각하는 감쟈🥔 2024. 4. 8. 17:07

 Function 

  - 반환 값이 존재 함
  - 복잡한 서브쿼리나 자주 사영되는 계산식을 만들어 컴파일하여 일반 API 함수 처험 사용
  - 반환 값을 자료 타입을 RETURN 문으로 선언해야하며, 실행영역에서 실제 자료를 반환하는 
    RETURN 문이 하나 이상 존재해야 함
  - 기타 특징은 PROCEDURE와 동일
  
  (사용형식)

  CREATE [OR REPLACE] FUNCTION 함수명 [{
          변수 [IN] | OUT | INOUT 데이터 타입 [,]
                            :
          변수 [IN] | OUT | INOUT 데이터 타입)]
          RETURN 데이터 타입
  IS | AS 
    선언영역
  BEGIN
    실행영역
  END;


  
  사용예) 회원아이디를 입력 받아 주소를 출력하는 함수를 작성하여 
         회원번호, 회원명, 주소 마일리지를 출력하시오

	CREATE OR REPLACE FUNCTION fn_member_address(
            P_MID IN MEMBER.MEM_ID%TYPE)
            RETURN VARCHAR2
        IS 
            L_ADDRESS VARCHAR2(500);
        BEGIN
            SELECT MEM_ADD1 || '  ' || MEM_ADD2 INTO L_ADDRESS
              FROM MEMBER
             WHERE MEM_ID = P_MID;
            RETURN L_ADDRESS;
        END;


        
  [실행]

        SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               fn_member_address(MEM_ID) AS 주소,
               MEM_MILEAGE AS 마일리지
          FROM MEMBER;



  사용예) 모든 회원의 2020년 4월 구매실적을 조회하는 함수를 작성하고,
         회원번호, 회원명, 구매금액, 마일리지를 출력하시오
         
       

	SELECT A.MEM_ID AS 회원번호,
                A.MEM_NAME AS 회원명,
                NVL(B.CSUM,0) AS 구매금액,
                A.MEM_MILEAGE AS 마일리지
           FROM MEMBER A,
                (SELECT C.CART_MEMBER AS CMID, 
                        SUM(C.CART_QTY*P.PROD_PRICE) AS CSUM
                   FROM CART C, PROD P
                  WHERE C.CART_PROD = P.PROD_ID
                    AND C.CART_NO LIKE '202004%'
                  GROUP BY C.CART_MEMBER) B
          WHERE A.MEM_ID=B.CMID (+)
          ORDER BY 1;


          
  [함수 : 회원번호를 입력 받아 2020년 4월 구매실적을 조회]
         

	CREATE OR REPLACE FUNCTION fn_sum_cart202004(
            P_MID MEMBER.MEM_ID%TYPE) -- IN 생략가능
            RETURN NUMBER 
          IS 
            L_SUM NUMBER := 0;  --L_SUM을 숫자로 받겠다 / 숫자는 초기화를 0으로 잡아주면 시작해야함

          BEGIN
            SELECT SUM(C.CART_QTY*P.PROD_PRICE) INTO L_SUM
              FROM CART C, PROD P
             WHERE C.CART_PROD = P.PROD_ID
               AND C.CART_NO LIKE '202004%'  --16명의 결과를 도출했지만 L_SUM은 1개의 값만 받을 수 있음
               AND C.CART_MEMBER = P_MID;
            RETURN L_SUM;
          END;


          
  [함수 호출]

	SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               NVL(fn_sum_cart202004(MEM_ID),0) AS 구매금액,
               MEM_MILEAGE AS 마일리지
           FROM MEMBER
          ORDER BY 1;


함수 프로시져 구분)
        함수 :  결과값을 꼭 필요한 경우
        프로시져 : INSERT DELETE UPDate 등 DML 명령이 필요한 경우 프로시저 사용 (반환값이 거의없음)

'Language > Oracle' 카테고리의 다른 글

[Oracle] SQL_Trigger  (0) 2024.04.09
[Oracle] PL/SQL  (0) 2024.04.04
[Oracle] SQL 객체_04 : INDEX  (0) 2024.04.01
[Oracle] SQL 객체_03 : SYNONYM  (0) 2024.03.29
[Oracle] SQL 객체_02 : SEQUENCE  (2) 2024.03.29
Comments