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되서 반환된다.