본문 바로가기
DataBase/MySQL

MySQL Stored Procedure (저장프로시저)

by Dev. Jkun 2014. 3. 28.
반응형

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
임시테이블 - Temproray Table  (0) 2014.03.26
MySQL 에러처리  (0) 2014.03.26
저장 프로시저 관련 포스팅  (0) 2014.03.26

댓글