개요
Stored Procedure에 대해서 알아보다보면 SQL 구문에 DELIMITER 라는 키워드를 찾아볼 수 있다. 이번 글에서는 DELIMITER의 역할에 대해서 잠깐 알아보려고 한다.
DELIMITER
기본적으로 SQL의 구문기호는 세미콜론(;)이다. 데이터베이스는 세미콜론을 기준으로 하나의 쿼리문을 인식하고 실행시킨다. 하지만 필요한 경우 구분 기호를 변경하여 사용하기도 한다. 이 때 사용하는 키워드가 바로 DELIMITER이다.
DELIMITER <문자열>
DELIMITER는 쿼리를 구분하는 구분 기호를 전달받은 문자열로 재정의하여 사용한다.
DELIMITER //
select 1//
select 2//
테스트해보면 기본 구분 기호인 세미콜론이 아니라 '//' 문자열을 구분 기호로 하여 쿼리가 실행되고 있음을 확인할 수 있다.
주요 사용처
DELIMITER는 여러 쿼리를 묶어서 한 번에 실행하는 프로시저 등을 정의할 때 주로 사용한다.
프로시저를 정의할 때 내부 문장 구분을 위해서 구분 기호를 사용하게 되는데, DELIMITER를 사용하지 않으면 프로시저와 프로시저 내부 문장을 구분하기 어려워지게 된다. 때문에 일반적으로 DELIMITER로 쿼리 구분 기호를 별도 문자/문자열로 설정한 뒤, 프로시저를 정의한 후 다시 쿼리 구분 기호를 기본값으로 원복하는 방식으로 사용한다.
-- 구분 기호 재정의
DELIMITER &&
-- 프로시저 정의
CREATE PROCEDURE test_procedure(
IN loop_str CHAR,
IN loop_val INT
)
BEGIN
declare idx INT DEFAULT 0;
WHILE (idx < loop_val) DO
SET idx = idx + 1;
END WHILE;
SELECT idx;
END &&
-- 구분 기호 원복
DELIMITER ;
그런데, DBeaver와 같은 클라이언트에서는 DELIMITER가 잘 동작하지 않는 것 같다.
클라이언트 도구를 사용할 때는 일반적으로 블럭을 잡아서 구문을 실행하는 편이라 DELIMITER를 잘 사용하지 않는다고……. 참고 삼아 기재한다.
참고 문서
https://dev.mysql.com/doc/refman/8.4/en/stored-programs-defining.html
https://www.geeksforgeeks.org/delimiters-in-sql/