본문 바로가기

[Oracle] Function/Procedure 차이점, 사용법, 예제

I'm 영서 2022. 4. 22.
반응형

오라클을 작성하는중 특정한 값을 반환해야 하는 매서드 같은 기능이 필요로 할때가 있다.

(예를들면 특정한 코드를 넣으면 해당 코드값의 명칭이 나온다거나 하는.. 

 

그런경우 Function과 Procedure를 처음 사용한다면 어떤걸 써야할지 잘 모를수 있기에 포스팅..

 

일반적으로 Function은 리턴값이 있고 Procedure는 리턴값이 없다. 라는 말을 찾을 수 있는데 반만 맞는 말이다.

 

 

 

Function 작성 양식

CREATE OR REPLACE FUNCTION /*Function Name*/
     ( /*파라미터*/
     /*양식 : 파라미터명 파라미터 타입
       IN_VALUE1 VARCHAR2,
       IN_VALUE2 NUMBER,
       IN_VALUE3 TABLENAME.COLUMN
      */
     )
RETURN /*데이터타입*/
IS||AS
       /*선언부
       P_DATA := NULL;
       P_DATA2 := 0;

       */
BEGIN
       /*실행부*/
       RETURN 반환값
       
       /* 문제발생시 */
       EXCEPTION 문장   //필수아님
END ;

Function 작성 예제

날짜 6자리나 8자리를 입력받아 1일 혹은 마지막날 가져오는 FUNCTION.

CREATE OR REPLACE FUNCTION FN_GET_DATE(
                 IN_DATE IN VARCHAR2,
                 IN_TYPE IN VARCHAR2 )
   RETURN VARCHAR2
IS
   V_DATA VARCHAR2(10) := NULL;
   V_IN_DATE VARCHAR2(20) := NULL;
BEGIN
   BEGIN
     IF LENGTH(TRIM(IN_DATE)) = 8 THEN
        V_IN_DATE := IN_DATE;     
     ELSIF LENGTH(TRIM(IN_DATE)) = 6 THEN
        V_IN_DATE := IN_DATE||'01';
     ELSE 
       RETURN NULL;
     END IF;          
   
     IF(IN_TYPE = 'FDATE') THEN
        V_DATA := LAST_DAY(TO_DATE(V_IN_DATE,'YYYYMMDD'));
     ELSIF(IN_TYPE ='TDATE') THEN
        V_DATA := LAST_DAY(TO_DATE(V_IN_DATE,'YYYYMMDD'));
     ELSE 
       RETURN NULL;
     END IF;
   EXCEPTION
     WHEN OTHERS THEN RETURN NULL;
   END;
      RETURN TO_DATE(V_DATA);
END;

 

Procedure 작성양식

CREATE OR REPLACE PROCEDURE 프로시저 이름
     ( /*파라미터*/ 
	   /*
       //이름    [IN/OUT/INOUT] 타입
       IN_VALUE1   IN  VARCHAR2
       OUT_VALUE1 OUT  NUMBER
       */
     )
IS||AS
       /*선언*/
       /*
       P_DATA := NULL;
       P_DATA2 := 0;
       */
       
BEGIN
       /*실행*/
       
       /*문제발생시*/
       EXCEPTION 문장   //필수아님
END ;

 

Procedure 작성예제

 

 

Function/ Procedure 차이점

참조링크

요약..

Function

 - 입력을 기반으로 파생 ( 입력된값을 가지고 재가공 )  

Procedure

 - 입력을 기반으로 수행 ( 입력된값을 가지고 테이블에 입력) 

때문에 Funtion에 DML을 수행 시키는 것은 매우 드물며(가능은하나 권장x)

Procedure에서 일반적으로 Return값을 사용하지 않을것... 

때문에 반환값이 있더라도 Sql에서 Procedure를 호출할 수 없다 라고 할 수 있다..

 

즉 Procedure와 Function의 차이점에 대한 답은

return값의 유무가 아닌 

Function은 입력을 기반으로 파생, Procedure는 입력을 기반으로 수행한다. . 이라고 볼 수 있겠다.. 

 

 

반응형

댓글