결론부터 말하면, 세미콜론(;)은 DELIMITER로 사용할 수 없습니다. 만약 그대로 세미콜론을 구분자로 지정한 상태에서 저장 프로시저(Stored Procedure)를 생성하려고 하면, 프로시저 내부의 각 문장이 세미콜론을 만나는 시점에 prematurely 종료되어 프로시저가 정상적으로 생성되지 않습니다.
왜 다른 구분자가 필요한가?
저장 프로시저의 본문에는 여러 개의 SQL 문장이 포함되며, 각 문장은 기본적으로 세미콜론으로 끝납니다. MySQL 클라이언트는 세미콜론을 문장의 끝으로 인식하기 때문에, 프로시저 전체를 하나의 단위로 전달하려면 임시로 다른 구분자(예: //, $$ 등)로 변경해야 합니다.
DELIMITER 변경 방법
다음은 올바른 작성 순서입니다. 먼저 구분자를 //로 변경하고, 프로시저 생성이 완료된 후 원래대로 되돌립니다.
DELIMITER //
CREATE PROCEDURE yourProcedureName()
BEGIN
yourStatement1;
.
.
.
statementN;
END
//
DELIMITER ;
실제 예제
위 문법을 실제로 적용하여 저장 프로시저를 생성해 보겠습니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE get_Message()
-> BEGIN
-> SELECT CONCAT("HELLO"," ","MYSQL USERS");
-> END
-> //
Query OK, 0 rows affected (0.23 sec)
mysql> DELIMITER ;
프로시저 호출
생성이 완료되면 CALL 명령어를 사용하여 저장 프로시저를 호출할 수 있습니다.
mysql> CALL get_Message();
실행 결과
위 명령을 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
+-----------------------------------+
| CONCAT("HELLO"," ","MYSQL USERS") |
+-----------------------------------+
| HELLO MYSQL USERS |
+-----------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
정리
- 세미콜론은 MySQL 클라이언트의 기본 문장 종료 문자이므로 DELIMITER로 사용할 수 없습니다.
- 저장 프로시저, 트리거, 함수 등을 생성할 때는
//또는$$같은 대체 구분자를 사용해야 합니다. - 작업이 끝난 후 반드시
DELIMITER ;로 원래 상태로 복구하는 것을 잊지 마세요.