MySQL 저장 프로시저에서 발생하는 SQL 구문 오류와 그 해결책
MySQL에서 저장 프로시저(Stored Procedure), 트리거(Trigger), 함수(Function)를 생성할 때 "SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서를 확인하여 올바른 구문을 확인하세요."라는 오류 메시지가 나타나는 경우가 많습니다. 이 오류의 주요 원인은 세미콜론(;)입니다. MySQL 클라이언트는 기본적으로 세미콜론을 하나의 SQL 문장 끝으로 인식하기 때문에, BEGIN...END 블록 안에 여러 문장이 포함된 프로시저를 작성하면 첫 번째 세미콜론에서 문장이 잘린 것으로 판단되어 불완전한 구문이 서버로 전송됩니다.
이러한 오류를 피하려면 구분자(delimiter)를 ;에서 //로 변경해야 합니다. 저장 프로시저, 트리거, 함수를 작성할 때는 반드시 구분자를 변경해 주는 것이 좋으며, 기본 문법은 다음과 같습니다.
DELIMITER //
CREATE PROCEDURE yourProcedureName()
BEGIN
Statement1,
.
.
N
END;
//
DELIMITER ;
실제 예제: 저장 프로시저 생성하기
위 문법을 이해하기 위해 실제로 저장 프로시저를 하나 만들어 보겠습니다. 저장 프로시저를 생성하는 쿼리는 다음과 같습니다.
mysql> DELIMITER // mysql> CREATE PROCEDURE sp_getAllRecords() -> BEGIN -> SELECT * FROM employeetable; -> END; -> // Query OK, 0 rows affected (0.23 sec) mysql> DELIMITER ;
프로시저 생성이 완료되면 마지막에 DELIMITER ;를 실행하여 구분자를 원래대로 되돌려 주는 것을 잊지 마세요.
저장 프로시저 호출하기
생성된 저장 프로시저는 CALL 명령으로 호출할 수 있습니다. 호출 문법은 다음과 같습니다.
CALL yourStoredProcedureName();
이제 위에서 만든 프로시저를 호출하여 Employee 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> CALL sp_getAllRecords();
실행 결과는 다음과 같습니다.
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 2 | Bob | 1000 | | 3 | Carol | 2500 | +------------+--------------+----------------+ 2 rows in set (0.00 sec) Query OK, 0 rows affected (0.02 sec)
정리
저장 프로시저, 트리거, 함수처럼 여러 SQL 문장을 포함하는 객체를 생성할 때는 다음 순서를 기억하세요.
1. DELIMITER //로 구분자를 변경한다.
2. BEGIN...END 블록을 포함한 객체를 자유롭게 작성한다.
3. 객체 생성 후 //로 정의를 종료한다.
4. DELIMITER ;로 구분자를 원래 상태로 복원한다.
이 과정만 지키면 세미콜론 충돌로 인한 "SQL 구문에 오류가 있습니다" 오류를 손쉽게 예방할 수 있습니다.