2016-06-15 1 views
0

여기에서부터 question. DELIMITER과 혼동스러워합니다. 이 언급 한 질문처럼 나에게 오류가 발생했습니다복합 문을 사용하여 EVENT를 만들 때이 오류가 발생한 이유는 무엇입니까?

CREATE EVENT test 
ON SCHEDULE EVERY 2 MINUTE 
DO 
BEGIN 
SELECT 1; 
SELECT 2; 
END 

: 그리고 나는 또한 다음과 같은 것을 시도

오류 코드 : 1064 당신은 당신의 SQL 구문에 오류가 있습니다 ; 라인 5.

에서 ''근처 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 내가 SQL을 실행 한 경우 다음

DELIMITER $$ 
CREATE EVENT test 
ON SCHEDULE EVERY 2 MINUTE 
DO 
BEGIN 
SELECT 1; 
SELECT 2; 
END $$ 
DELIMITER; 

는이 일을하고 새로운 창조 EVENT 성공적으로 있습니다.

이 두 SQL 간의 유일한 차이는 DELIMITER입니다. 따라서 내 질문에 DELIMITER이 사용됩니다. 누구든지 내게 설명 할 수 있니?

도움을 주시면 감사하겠습니다.

답변

1

정말 사소하지만 설명하기 어렵습니다.

구분 기호는 ; ... mysql이 문장이 종료되었음을 알 수있는 방법입니다. 그러나 저장 프로 시저, 이벤트, 함수와 같은 것들은 그 안에 많은 문장을 가지고 있습니다. 그것은 어디서 시작하고 어디에서 끝나는 지 아는 것이 전체를위한 외부 래퍼를 필요로합니다.

그래서, 당신은 $$처럼 $$ 바로 END 후, 다음 오류와 함께 와서 너무 ;

당신이가는 이야기 다시 공장으로 다시 설정 넣어, 기괴한 뭔가 시작 부분에 구분 기호를 재설정 저장 프로 시저, 이벤트, 함수, 트리거의 생성을 위해 항상 그것없이. 그리고 꼬리를 쫓는 데 많은 시간을 소모하게됩니다. 거기에없는 구문 오류를 찾으십시오. 음, 꽤 자주. 실제로는 DELIMITER 랩퍼가 없습니다. 당신이 세미콜론 문자를 포함하는 저장된 프로그램을 정의 할 mysql 클라이언트 프로그램을 사용하는 경우

+0

대단히 감사합니다. @Drew – Blank

2

당신의 대답은 여기 21.1 Defining Stored Programs

워드 프로세서에있다, 문제가 발생한다. 기본적으로 mysql은 세미콜론을 명령문 구분 기호로 인식하므로, mysql이 저장된 프로그램 정의 전체를 서버로 전달하도록 임시로 구분 기호를 재정의해야합니다.

+0

고맙습니다. Upvote! : D – Blank

+0

내가 도울 수있어서 기뻐. –

+0

사소한 편집 같은 느낌이 들지 않는다. 나는 맹세한다. :) 그러나 나는 여기에'mysql'을 인용했다. 각 경우에 클라이언트 유틸리티를 참조합니다. 일반적인 오해는'DELIMITER'가 서버에 보내지지만 실제로는 클라이언트 지시어에 불과하다는 것입니다. +1 –

관련 문제