본문 바로가기

DataBase/MySQL

MySQL Stored Procedure (저장프로시저)

MySQL 저장프로시저

내가 익숙치 않거나 못해서 그런걸수도 있지만 정말로 쓰다보니.. 많이 부족함과 불편함이 이만 저만이 아니다.

그리고 너무 많은 구글링 필요하다;;

MySQL 저장프로시저를 만들고 사용하다 보면 MS-SQL Server 와 오라클의 저장프로시저가 너무나 그리워

진다. 역시.. 돈들여서 안좋은건 없다고.. 다시한번 또..새삼스럽게..ㅎㅎ

일단 샘플로 간단하게 MySQL 저장프로시저 올린다.



DELIMITER $$

DROP PROCEDURE IF EXISTS SP_EMP_DPT_UPDATE $$
CREATE PROCEDURE SP_EMP_DPT_UPDATE(
	IN_UNION_QUERY_TEXT VARCHAR(1500),
	IN_EMP_NO INT,
	OUT OUT_RETURN_VALUE TINYINT
)
BEGIN
	DECLARE INSERT_QUERY_STRING VARCHAR(1500);
	DECLARE CATCH_ERROR TINYINT;	
	DECLARE EXIT HANDLER FOR SQLEXCEPTION SET CATCH_ERROR = -1;

	SET AUTOCOMMIT = 0;
	SET SQL_SAFE_UPDATES = 0;

	START TRANSACTION;

	DROP TEMPORARY TABLE IF EXISTS TEMP_MEMBER_EMP_DPT;
	CREATE TEMPORARY TABLE TEMP_MEMBER_EMP_DPT (
		EMP_DPT_NO INT,
		EMP_NO INT,
		DPT_NAME VARCHAR(100),
		DPT_AUTH TINYINT
	) engine = memory;

	SET @INSERT_QUERY_STRING = CONCAT("INSERT INTO TEMP_MEMBER_EMP_DPT (EMP_DPT_NO, EMP_NO, DPT_NAME, DPT_AUTH) ", IN_UNION_QUERY_TEXT);

	PREPARE STMT FROM @INSERT_QUERY_STRING;	
	EXECUTE STMT;
	DEALLOCATE PREPARE STMT;	

	UPDATE MEMBER_EMP_DPT AS A INNER JOIN TEMP_MEMBER_EMP_DPT AS B
		ON A.EMP_DPT_NO = B.EMP_DPT_NO
	SET A.DPT_NAME = B.DPT_NAME
	WHERE A.EMP_NO = IN_EMP_NO;

	INSERT INTO MEMBER_EMP_DPT (EMP_NO, DPT_NAME, DPT_AUTH)
	SELECT EMP_NO, DPT_NAME, DPT_AUTH
		FROM TEMP_MEMBER_EMP_DPT
	WHERE EMP_DPT_NO NOT IN (SELECT DISTINCT EMP_DPT_NO
							 FROM MEMBER_EMP_DPT
							 WHERE EMP_NO = IN_EMP_NO)
		AND EMP_NO = IN_EMP_NO;

	IF CATCH_ERROR < 0 THEN
		ROLLBACK;
		SET OUT_RETURN_VALUE = 0;
	ELSE
		COMMIT;
		SET OUT_RETURN_VALUE = 1;
	END IF;


	DROP TEMPORARY TABLE IF EXISTS TEMP_MEMBER_EMP_DPT;
	
	SELECT OUT_RETURN_VALUE;
END$$

#DELIMITER ;

'DataBase > MySQL' 카테고리의 다른 글

참조키 선언시 에러  (0) 2014.11.26
우분투에서 mysql 삭제 후 재설치  (0) 2014.11.26
MySQL Stored Procedure (저장프로시저)  (2) 2014.03.28
임시테이블 - Temproray Table  (0) 2014.03.26
MySQL 에러처리  (0) 2014.03.26
저장 프로시저 관련 포스팅  (0) 2014.03.26