ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [mySQL] 프로시저 만들기(DECLARE, SET, IN, IF, ELSEIF 등)
    DataBase/MariaDB & MySQL 2018. 3. 5. 19:55

    MariaDB에서 프로시저를 처음 만들어봤는데,


    그 방법을 정리.


    다른 방법도 많이 있지만 지금 내가 만든 프로시저로 내가 원하는 결과 값은 얻을 수 있었다. 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    DROP PROCEDURE IF EXISTS check_insert; /* 기존에 프로시저가 존재하면 DROP */
    CREATE PROCEDURE `check_insert`(IN in_pk_seq int(11/* 받아야할 파라미터 */
            , IN in_detail_seq    int(11)
            , IN in_group_num      varchar(32)
            , IN in_company_num      varchar(32)
            , IN in_department_num      varchar(32)
            , IN in_employee_num      varchar(32)
            , IN in_check_time    int(5)
            , IN in_request_date int(10)
            )
    BEGIN /* 프로시저 로직 시작 */
        DECLARE over_time int(11); /* DECLARE는 프로시저 안에서 사용할 변수를 생성한다. */
        DECLARE deadline int(10);
        DECLARE exist_same_date int(3);
        DECLARE result varchar(10default '성공';
     
        SET over_time = 600 /* SET은 존재하는 변수의 값을 바꿔주거나 대입할 수 있다. */   
        SET deadline = 20180305
        SET exist_same_date = (SELECT count(requestWorkTime.request_day)
                                   FROM request_work_time requestWorkTime
                                  WHERE requestWorkTime.group_num = in_group_num
                                    AND requestWorkTime.company_num = in_company_num
                                    AND requestWorkTime.department_num = in_department_num
                                    AND requestWorkTime.employee_num = in_employee_seq
                                    AND requestWorkTime.request_date = in_reqeust_date); /* 쿼리의 결과 값도 넣어줄 수 있다. */
       
        
        IF in_check_time > over_time /* IF문과 ELSEIF문은 다음과 같이 사용한다. */
        THEN SET result = '시간초과';  /* 근무한 시간이 600분을 넘겼을 때 */
         
        ELSEIF in_request_date > deadline 
        THEN SET result = '마감'/* 신청일자가 마감기한을 넘겼을 때 */
        
        ELSEIF exist_same_date != 0 
        THEN SET result = '중복';  /* 신청한 날짜가 이미 DB에 있을 때 */
        END IF;
       
        IF result = '성공' THEN /* 이상없을 경우 정상 실행 */
        
         INSERT INTO request_work_time(pk_seq, detail_seq, group_num, company_num, department_num, 
         employee_num, check_time, request_date)
         VALUES (in_pk_seq, in_detail_seq, in_group_num, in_company_num, in_department_num, in_employee_num, in_check_time, in_request_date);
       
        END IF;        
        
        SELECT result; /* 이 프로시저를 실행할 경우 select된 result 값이 리턴된다. */
    END;
    cs


    * DROP PROCEDURE IF EXISTS 프로시저명 : 기존에 프로시저가 존재한다면 DROP 시킨다.


    * CREATE PROCEDURE '프로시저명' (IN 들어올 파라미터명과 타입, OUT 나갈 파라미터명과 타입): 프로시저명에 맞는 프로시저 생성.


    * BEGIN (로직) END : 프로시저가 타면서 일어날 로직의 시작과 끝.


    * DECLARE 사용할 변수명 변수타입 default (디폴트로 설정할 값): 자바에서 쓰는 변수처럼 프로시저 안에서 사용할 변수를 선언.


    * SET (DECLARE에서 선언한 변수) = 대입할 값: 원하는 값으로 세팅한다.


    * IF (조건값) THEN (조건에 맞을 경우 실행될 로직) END IF : IF문 문법


    * ELSEIF : ELSE IF 문법


    마지막에 실행된 쿼리가 동작하면서 result값이 select되서 반환된다.

Designed by Tistory.