Skip to the content.

Procedure

조회

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE';

SHOW PROCEDURE STATUS;

# DDL 확인
SHOW CREATE PROCEDURE schema_name.prcedure_name;


기본 형식

DELIMITER $$
CREATE DEFINER=`user_name`%`host_name` PROCEDURE procedure_name(
	IN  pi_var_name VARCHAR2(2);             # 파라미터 선언 (IN)
	OUT po_var_name VARCHAR2(4);             # 파라미터 선언 (OUT)
)
BEGIN
	DECLARE eor BOOLEAN DEFAULT FALSE;                #   여부

	# 변수 선언
	DECLARE var_name VARCHAR(2) DEFAULT pi_var_name;

	# 할당
	SET po_var_name = varname + 'A';

	# 커서
	DECLARE cursor_name CURSOR FOR
		SELECT column_name FROM schema_name.table_name; # 해당 쿼리 결과를 사용

	# 핸들러
	DECLARE CONTINUE HANDLER                          #  이상 행이 없다면 eor = TRUE
		FOR NOT FOUND SET eor = TRUE;

	# 커서 Open
	OPEN cursor_name;
		# 루프
		loop_name : LOOP
			# Fetch
			FETCH cursor_name INTO var_name;              # 데이터 가져오기
			IF eor THEN
				LEAVE loop_name;                            #  이상 데이터가 없다면 루프 해제
			END IF;

			# 가져온 데이터 처리 (Example)
			/*
			IF NOT EXISTS (SELECT column_name FROM schema_name.table_name WHERE column_name = var_name)
				THEN DELETE FROM schema_name.table_name WHERE column_name = var_name;
			END IF;

			SET v_partition_name = DATE_FORMAT(DATE_ADD(DATE(v_partition_name_before), INTERVAL 1 DAY), '%Y-%m-%d');

			ALTER TABLE v_schema_name.v_table_name ADD PARTITION(
				PARTITION v_partition_name VALUES LESS THAN ( v_partition_date )
			);
			*/

		# 루프 
		END LOOP loop_name;

	# 커서 Close
	CLOSE cursor_name;
END;


특징


핸들러

# 에러 발생  변수 값을 1 설정하고 다음 내용을 실행
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET variable_name = 1;

# 에러 발생  롤백  에러 메시지를 표시하고 현재 코드 단락을 나감
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
	ROLLBACK;
	SELECT 'Error Message!'; # An error has occurred, operation rollbacked and the stored procedure was terminated
END;

# SELECT INTO CURSOR   이상 가져올 데이터가 없다면 변수 값을 1 설정하고 계속 실행
DECLARE CONTINUE HANDLER FOR NOT FOUND SET variable_name = 1;

# 해당 코드에 해당하는 에러가 발생하면 에러 메시지를 표시하고 계속 실행
# 1062 중복  에러
DECLARE CONTINUE HANDLER FOR 1062
SELECT 'Error Message!'; # Duplicate entry '1' for key 'PRIMARY'


핸들러의 우선순위

|우선순위|핸들러| |-|-| |1|MySQL 에러 코드 핸들러| |2|SQLSTATE 핸들러| |3|SQLEXCEPTION|


IF

IF 조건식 THEN
	실행문;
ELSEIF 조건식 THEN
	실행문;
ELSE
	실행문;
END IF;