2011-06-13 1 views
1

SQLYog를 사용하여 저장 프로 시저를 만들 때 다음 템플릿을 제공합니다.SQLYog가 MySQL 저장 프로 시저를 만들 때 구분 기호를 변경하는 이유는 무엇입니까?

DELIMITER $$ 

CREATE 
    /*[DEFINER = { user | CURRENT_USER }]*/ 
    PROCEDURE `apachelogs`.`test`() 
    /*LANGUAGE SQL 
    | [NOT] DETERMINISTIC 
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 
    | SQL SECURITY { DEFINER | INVOKER } 
    | COMMENT 'string'*/ 
    BEGIN 

    END$$ 

DELIMITER ; 

저장 프로 시저를 만들기 전에 구분 기호가 변경되는 이유가 궁금합니다. 그리고 왜 create 문 안쪽에 ; 구분 기호를 사용할 수 있습니까 (범위 때문일 수도 있습니다).

답변

2

이렇게하면 MySQL이 저장 프로 시저 내부의 모든 세미콜론을 구분 기호로 해석하지 않도록 명령문 구분 기호를 $$으로 변경합니다. DELIMITER $$이 없으면 내부에 문을 구분하기 위해 ;이 포함 된 저장 프로 시저를 정의 할 수 없습니다. 프로 시저의 정의 기간 동안 세미콜론을 전역 적으로 벗어나는 방법이라고 생각할 수 있습니다. fine manual에서

:

MySQL의 구분 기호를 재정의는 delimiter 명령을 사용합니다. 다음 예제에서는 방금 표시된 dorepeat() 절차에 대해이 작업을 수행하는 방법을 보여줍니다. 구분 기호는 //으로 변경되어 전체 정의를 단일 명령문으로 서버에 전달한 다음 절차를 호출하기 전에 ;으로 복원합니다. 이렇게하면 절차 본문에 사용 된 ; 구분 기호가 mysql으로 해석되는 것이 아니라 서버로 전달 될 수 있습니다.

내 설명이 설명서보다 명확하지만 어쩌면 그 중 하나 (또는 ​​둘다 결합)가 약간의 이해를 가져올 지 모르겠다.

관련 문제