Почему SQLYog изменяет разделитель при создании хранимой процедуры MySQL? - PullRequest
1 голос
/ 13 июня 2011

Когда я делаю хранимую процедуру с помощью 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 (думаю, это может быть из-за области видимости).

1 Ответ

2 голосов
/ 13 июня 2011

Это меняет разделитель оператора на $$, чтобы MySQL не пытался интерпретировать любые точки с запятой внутри хранимой процедуры как разделитель. Без DELIMITER $$ вы не сможете определить хранимую процедуру, которая содержит ; для разделения операторов внутри нее. Вы можете думать об этом как о способе глобально избежать точки с запятой на время определения процедуры.

Из тонкой инструкции :

Чтобы переопределить разделитель mysql , используйте команду delimiter. В следующем примере показано, как это сделать для только что показанной процедуры dorepeat(). Разделитель изменен на //, чтобы все определение можно было передать на сервер в виде одного оператора, а затем восстановить до ; перед вызовом процедуры. Это позволяет передавать на сервер разделитель ;, используемый в теле процедуры, а не интерпретироваться самим mysql .

Не знаю, понятнее ли мое объяснение, чем руководство, но, может быть, одно из них (или оба вместе) приведет к некоторому пониманию.

...