2011-06-13 29 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本身解釋。

我不知道我的解釋是否比手冊更清楚,但也許其中一個(或兩者結合)會導致一些理解。