Почему SQLYOG меняет разделитель, когда он создает хранимую процедуру MySQL?
-
27-10-2019 - |
Вопрос
Когда я делаю хранимую процедуру с SQLYOG, он дает мне этот шаблон:
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
Заявление (я думаю, это может из -за масштаба).
Решение
Это меняет разделитель утверждения на $$
Чтобы MySQL пытался интерпретировать любые полуколоны внутри хранимой процедуры как разделитель. Без DELIMITER $$
, вы не сможете определить хранимую процедуру, в которой содержалась ;
разграничить заявления внутри него. Вы можете думать об этом как о способе глобального избежания полуколона на протяжении всей определения процедуры.
Переопределить mysql разделитель, используйте
delimiter
командование В следующем примере показано, как это сделать дляdorepeat()
Процедура только что показана. Разделитель изменен на//
Чтобы включить все определение передаваться на сервер в виде единого оператора, а затем восстановлено в;
Перед вызовом процедуры. Это позволяет;
разделитель, используемый в корпусе процедур, который должен быть передан на сервер, а не интерпретируется mysql сам.
Я не знаю, является ли мое объяснение более ясным, чем руководство, но, возможно, один из них (или оба комбинированных) приведет к некоторому пониманию.