투케이2K

51. (MYSQL/SQL) 프로시저 (PROCEDURE) - 특정 부서 데이터 삽입 수행 본문

MySqlDB

51. (MYSQL/SQL) 프로시저 (PROCEDURE) - 특정 부서 데이터 삽입 수행

투케이2K 2022. 6. 4. 11:16

[개발 환경 설정]

개발 툴 : Heidi

개발 언어 : Mysql

 

[소스 코드]

/**************************************************************/
-- [DELIMITER : 프로시저 앞,뒤의 위치하여 안에 있는 부분은  한번에 실행]
DELIMITER $$ 
/**************************************************************/
DROP PROCEDURE IF EXISTS PRO_INS_DEPT; -- [이미 생성된 프로시저가 있으면 DROP]
CREATE PROCEDURE PRO_INS_DEPT -- [프로시저 생성]
(
    IN I_DEPT_NAME VARCHAR(100), -- [인풋 : 부서 이름]
    IN I_DEPT_PHONE VARCHAR(100), -- [인풋 : 부서 연락처]
    IN I_DEPT_PLACE VARCHAR(100), -- [인풋 : 부서 위치]    
    
    OUT O_MSG VARCHAR(500) -- [리턴 : 메시지]
)

/**************************************************************/


/***************************************************************
[프로시저 설명]


[설 명] : 부서 정보 삽입 프로시저


[프로시저 호출] : 

CALL PRO_INS_DEPT('고조선', '070-123-5555', 'P-A', @O_MSG);
SELECT @O_MSG;


[프로시저 삭제] :

DROP PROCEDURE PRO_INS_DEPT;


[프로시저 생성 목록 확인] : 

SHOW PROCEDURE STATUS;
 
***************************************************************/


/**************************************************************/
PROC_BODY : BEGIN
/**************************************************************/


    -- [전역 변수 선언]
    DECLARE M_DEBUG VARCHAR(100) DEFAULT '';
    DECLARE M_COUNT INTEGER DEFAULT 0;
    DECLARE M_MAX_IDX INTEGER DEFAULT 0;
    
    
    
    
    
    -- [SQL 수행 EXCEPTION 처리]
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        -- [롤백 처리 실시]
        ROLLBACK;
        
        -- [리턴 데이터 삽입]
        SET O_MSG = CONCAT('N : EXCEPTION : M_DEGUB : [', CAST(M_DEBUG AS CHAR), ']');
        
    END;
    
    
    
    
    
    -- [1] : 인풋 데이터 널 체크 수행 실시    
    SET M_DEBUG = '1'; -- [디버깅 단계]
    
    IF I_DEPT_NAME IS NULL OR I_DEPT_NAME = '' OR LENGTH(I_DEPT_NAME) = 0 
       OR I_DEPT_PHONE IS NULL OR I_DEPT_PHONE = '' OR LENGTH(I_DEPT_PHONE) = 0 
       OR I_DEPT_PLACE IS NULL OR I_DEPT_PLACE = '' OR LENGTH(I_DEPT_PLACE) = 0 THEN
       
       -- [리턴 데이터 삽입]
       SET O_MSG = CONCAT('N : INPUT DATA IS NULL : M_DEGUB : [', CAST(M_DEBUG AS CHAR), ']');
       
       -- [프로시저 종료]
       LEAVE PROC_BODY;
       
    END IF;
    
    
    
    
    -- [SQL 트랜잭션 처리 실시]
    START TRANSACTION;
    
        -- [2] : 이미 부서 정보가 포함되어있는지 확인
        SET M_DEBUG = '2'; -- [디버깅 단계]
        
        
        SET M_COUNT = ( 		  
            SELECT COUNT(*)
            FROM TEST_DEPT
            WHERE TRIM(T_DEPT_NAME) = TRIM(I_DEPT_NAME)
        );
        
        
        IF M_COUNT > 0 THEN
            -- [리턴 데이터 삽입]
            SET O_MSG = CONCAT('N : DATA IS ALREADY : M_DEGUB : [', CAST(M_DEBUG AS CHAR), ']');  
            
            -- [프로시저 종료]
            LEAVE PROC_BODY;  				   
        END IF;
        
        
        
        
        
        -- [3] : 부서 인덱스 번호 최대값 확인 실시
        SET M_DEBUG = '3'; -- [디버깅 단계]
        
        SET M_MAX_IDX = ( 		  
            SELECT MAX(CAST(T_DEPT_IDX AS SIGNED))
            FROM TEST_DEPT
        );
        SET M_MAX_IDX = M_MAX_IDX + 1;
        
        
        
        
        
        -- [4] : INSERT 데이터 삽입 수행 실시         
        SET M_DEBUG = '4'; -- [디버깅 단계]
        
        INSERT INTO TEST_DEPT VALUES (CAST(M_MAX_IDX AS CHAR), I_DEPT_NAME, I_DEPT_PHONE, I_DEPT_PLACE);
        
        
        
        
        
        -- [5] : [리턴 데이터 삽입]
        SET M_DEBUG = '5'; -- [디버깅 단계]
        
        SET O_MSG = CONCAT('Y : SUCCESS : M_DEGUB : [', CAST(M_DEBUG AS CHAR), ']');  
    
    
    -- [SQL COMMIT 처리 실시]
    COMMIT;
	     
/**************************************************************/
END$$;
DELIMITER ;
/**************************************************************/
 

[결과 출력]

 

 

반응형
Comments