Почему SQLYOG меняет разделитель, когда он создает хранимую процедуру MySQL?

StackOverflow https://stackoverflow.com/questions/6326825

Вопрос

Когда я делаю хранимую процедуру с 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 сам.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top