MariaDB

mariadb 프로지서 생성 2중 호출 에러 파라미터체크

밥돌이밥순이 2024. 8. 19. 10:22
반응형

mariadb 프로지서 생성후 프로지서 호출 프러저안에서 에러처 파라미터 체크 프로지서에서 프로시저 호출

1. 기본프로시저 생성

  • 프로시저 생성
  • 프로시저 존재하면 삭제 
  • 파라미터 추가  한글 사용시 CHARACTER SET UTF8 설정 추가 할것 
  • 프로시저 호출 CALL SP_LOGIN('user', 'password')
DROP PROCEDURE IF EXISTS SP_LOGIN; 
DELIMITER $$
CREATE PROCEDURE SP_LOGIN(
	IN I_LOGIN_ID 		VARCHAR(50) CHARACTER SET utf8,
	IN I_PASSWORD 		VARCHAR(50) CHARACTER SET UTF8
)
BEGIN
	/*
		CALL SP_LOGIN('user', 'password')
	*/
END $$
DELIMITER ;

2.try catch ... SQL에러 처리 (문법 ,로직 등등)

  • UDE 사용자 정의 에러 (로젝체크 할때  
  • Maria에서 제공하는 에러 
  • 99999는 사용정의 한 값 일 때 에러 로그 기록 하지 않습니다.
  • 기타 오류는 로그 기록 추후 디버그 할때 사용
  • V_PARAM 입력 파라미터 Json으로 기록,JSON_OBJECT를 통해 json 으로 변경
  • SP_SYS_LOG_ERR_INSERT 로그 기록 
	/*--------------------------------------------------------------------*/
	/* 변수 추가 
	/*--------------------------------------------------------------------*/	
	DECLARE V_PARAM   TEXT 			 CHARACTER SET UTF8;
	DECLARE V_RTN_CD 	VARCHAR(50)  CHARACTER SET UTF8 	DEFAULT 'OK';
    DECLARE V_RTN_MSG VARCHAR(100) CHARACTER SET utf8;
	-- 사용장 정의   
	DECLARE V_USER_CNT INT DEFAULT 0;
	/*--------------------------------------------------------------------*/
	/* EXCEPTION 로그 기록 
	/*--------------------------------------------------------------------*/
	#DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_loop_done = TRUE;  --NOT FOUND 예외 선언
	DECLARE UDE CONDITION FOR SQLSTATE '99999' ;  -- user-defined exception
   DECLARE EXIT HANDLER FOR SQLEXCEPTION	-- 아래 INSERT에서 SQLEXCEPTION 에러 발생시 BEGIN~END 실행하는 예외처리
   BEGIN
		GET DIAGNOSTICS CONDITION 1  @rs = RETURNED_SQLSTATE , @mt = MESSAGE_TEXT;
		-- 사용자 정의 예외 정보 설정
   	IF  @rs ='99999' THEN
   		SET V_RTN_MSG = concat(V_RTN_MSG);
   	ELSE
   		IF V_RTN_CD ='OK' THEN SET V_RTN_CD='E'; END IF;
   		SET V_RTN_MSG = concat(@rs,' : ' ,@mt);
   		-- IN, INOUT 파라미터 기술
			SET V_PARAM = JSON_OBJECT('I_LOGIN_ID', I_LOGIN_ID			 ,'I_PASSWORD',I_PASSWORD);
   		CALL SP_SYS_LOG_ERR_INSERT('SP','SP_LOGIN',concat(V_RTN_CD,' : ',V_RTN_MSG,'V_PARAM:',V_PARAM),NULL,'192.168.1.*',I_LOGIN_ID);
   	END IF;
      
    	SELECT V_RTN_CD AS RTN_CD , V_RTN_MSG AS RTN_MSG;
   END;

3.파라미터 체크 

  • 매개 변수 체크 
  • SIGNAL UDE 를 통해 사용자 정의로  유도(DECLARE UDE CONDITION FOR SQLSTATE '99999')
  • 로직 체크 하다고 롤백 할때 사용 할수 있음
	/*--------------------------------------------------------------------*/
	/* 파라미터 체크
	/*--------------------------------------------------------------------*/
	IF I_LOGIN_ID IS NULL OR LENGTH(I_LOGIN_ID) <1 THEN
		SET V_RTN_CD ='00001';
		SET V_RTN_MSG ='I_LOGIN_ID 필수 입력 입니다.';
		SIGNAL UDE;		
	END IF ;

4.결과 

  • 개발자와  정의 
  • 결과가 있든 없든   필수 출력 
  • RTN_CD ='OK' 이면 처리 성공  실패시 RTN_MSG 값 화면에 표시 
  
	/*--------------------------------------------------------------------*/
	/* 처리 결과
	/*--------------------------------------------------------------------*/
	SELECT V_RTN_CD AS RTN_CD , V_RTN_MSG AS RTN_MSG,I_LOGIN_ID AS LOGIN_ID;

9. 소스 

DROP PROCEDURE IF EXISTS SP_API_LOGIN; 
DELIMITER $$
CREATE PROCEDURE SP_API_LOGIN(
	IN I_LOGIN_ID 		VARCHAR(50) CHARACTER SET utf8,
	IN I_PASSWORD 		VARCHAR(50) CHARACTER SET UTF8,
	IN I_IP 				VARCHAR(50) CHARACTER SET UTF8
)

BEGIN
	/*
		CALL SP_API_LOGIN(NULL, 'api', '192.168.1.1')
	*/
	-- 기본 
	DECLARE V_PARAM   			TEXT 				CHARACTER SET UTF8;
	DECLARE V_RTN_CD 				VARCHAR(50)  	CHARACTER SET UTF8 	DEFAULT 'OK';
   DECLARE V_RTN_MSG 			VARCHAR(100) 	CHARACTER SET utf8;
	-- 사용장 정의   
	DECLARE V_USER_CNT INT DEFAULT 0;
	/*--------------------------------------------------------------------*/
	/* EXCEPTION 로그 기록 
	/*--------------------------------------------------------------------*/
	#DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_loop_done = TRUE;  --NOT FOUND 예외 선언
	DECLARE UDE CONDITION FOR SQLSTATE '99999' ;  -- user-defined exception
   DECLARE EXIT HANDLER FOR SQLEXCEPTION	-- 아래 INSERT에서 SQLEXCEPTION 에러 발생시 BEGIN~END 실행하는 예외처리
   BEGIN
		GET DIAGNOSTICS CONDITION 1  @rs = RETURNED_SQLSTATE , @mt = MESSAGE_TEXT;

		-- 사용자 정의 예외 정보 설정
   	IF  @rs ='99999' THEN
   		SET V_RTN_MSG = concat(V_RTN_MSG);
   	ELSE
   		IF V_RTN_CD ='OK' THEN SET V_RTN_CD='E'; END IF;
   		SET V_RTN_MSG = concat(@rs,' : ' ,@mt);
   		-- IN, INOUT 파라미터 기술
			SET V_PARAM = JSON_OBJECT('I_LOGIN_ID', I_LOGIN_ID			 ,'I_PASSWORD',I_PASSWORD,'I_IP',I_IP);
   		CALL SP_SYS_LOG_ERR_INSERT('SP','SP_API_LOGIN',concat(V_RTN_CD,' : ',V_RTN_MSG,'V_PARAM:',V_PARAM),null,I_IP,I_LOGIN_ID);
   	END IF;
      
    	SELECT V_RTN_CD AS RTN_CD , V_RTN_MSG AS RTN_MSG;
   END;
   
    
	/*--------------------------------------------------------------------*/
	/* 파라미터 체크
	/*--------------------------------------------------------------------*/
	IF I_LOGIN_ID IS NULL OR LENGTH(I_LOGIN_ID) <1 THEN
		#SET V_RTN_CD ='00000';
		#SET V_RTN_MSG =FN_GET_MSG('KOR','MSG_00002','');
		SET V_RTN_CD ='00001';
		SET V_RTN_MSG ='I_LOGIN_ID 필수 입력 입니다.';
		SIGNAL UDE;		
	END IF ;
 
	SELECT COUNT(*) INTO V_USER_CNT FROM tb_sys_user u WHERE u.USER_ID =I_LOGIN_ID AND U.PW =I_PASSWORD  AND U.SYS_CD ='API';
 
	IF V_USER_CNT = 1 THEN
		SET V_RTN_CD ='OK';
		SET V_RTN_MSG =FN_GET_MSG('KOR','MSG_00001','');
		 
		/*------------------------------------------------------------------------*/
	   /* 시스템 접속 로그 생성 - 시스템 로그인 시 생성
	   /*------------------------------------------------------------------------*/
		CALL SP_SYS_LOG_LOGIN_INSERT( I_LOGIN_ID	-- I_LOGIN_ID
		                        , 'Y'				-- Y 록인 성공 N:로그인 실패
										, I_IP			-- I_IP
		);
		/*------------------------------------------------------------------------*/
      /*로그인 여부 기록
      /*------------------------------------------------------------------------*/
		UPDATE tb_sys_user 
		   SET LOGIN_YN ='Y'
		 WHERE USER_ID =I_LOGIN_ID;
	ELSE
		SET V_RTN_CD ='00000';
		SET V_RTN_MSG =FN_GET_MSG('KOR','MSG_00002','');
		/*------------------------------------------------------------------------*/
	   /* 시스템 접속 로그 생성 - 시스템 로그인 시 생성
	   /*------------------------------------------------------------------------*/
		CALL SP_SYS_LOG_LOGIN_INSERT( I_LOGIN_ID	-- I_LOGIN_ID
		                        , 'Y'				-- Y 록인 성공 N:로그인 실패
										, I_IP			-- I_IP
		);
		SIGNAL UDE;
	END IF; 
  
	/*--------------------------------------------------------------------*/
	/* 처리 결과
	/*--------------------------------------------------------------------*/
	SELECT V_RTN_CD AS RTN_CD , V_RTN_MSG AS RTN_MSG,I_LOGIN_ID AS LOGIN_ID;
 
END $$
DELIMITER ;

 

 

 

 

반응형