콘텐츠로 이동

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;


특징

  • 프로시저 정의 할때는 DELIMITER $$ 을 사용 (문장 구분자가 ; 인데 이는 프로시저 정의 부분에 사용해야하므로 ; 를 인식하지 못하게 하기 위한 장치)
  • 커서는 루프를 이용해 연속적인 데이터 처리를 할 수 있게 함
  • FETCH는 오픈된 커서의 데이터를 한 행씩만 가져올 수 있음


핸들러

# 에러 발생 시 변수 값을 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;