Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 'SQL 구문에 오류가 있습니다' 오류 해결 방법 — DELIMITER 변경 가이드

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 구문에 오류가 있습니다" 오류를 손쉽게 예방할 수 있습니다.