MySQLストアドプロシージャを作成したときにSQLyogがDelimiterを変更するのはなぜですか?
-
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 ;
ストアドプロシージャを作成する前に、なぜDelimiterを変更するのだろうか。そして、なぜ私はまだ使用できるのか ;
内部のデリミッター create
ステートメント(範囲が原因である可能性があると思います)。
解決
これにより、ステートメントデリミタが変更されます $$
MySQLがストアドプロシージャ内のセミコロンを区切り文字として解釈しないようにします。なしで DELIMITER $$
, 、含まれるストアドプロシージャを定義することはできません ;
その中のステートメントを区切ります。手順の定義の期間中、セミコロンをグローバルに逃れる方法と考えることができます。
から ファインマニュアル:
再定義する mysql デリミッター、使用します
delimiter
指図。次の例は、これを行う方法を示していますdorepeat()
表示されている手順。区切り文字が変更されます//
定義全体を単一のステートメントとしてサーバーに渡すことを有効にし、次に復元します;
手順を呼び出す前に。これにより、;
プロシージャ本文で使用されるデリミターは、によって解釈されるのではなく、サーバーに渡されるために使用されます mysql 自体。
私の説明がマニュアルよりも明確であるかどうかはわかりませんが、おそらくそのうちの1つ(または両方の組み合わせ)がある程度の理解につながるでしょう。
所属していません StackOverflow