MySQLストアドプロシージャを作成したときにSQLyogがDelimiterを変更するのはなぜですか?

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 ;

ストアドプロシージャを作成する前に、なぜDelimiterを変更するのだろうか。そして、なぜ私はまだ使用できるのか ; 内部のデリミッター create ステートメント(範囲が原因である可能性があると思います)。

役に立ちましたか?

解決

これにより、ステートメントデリミタが変更されます $$ MySQLがストアドプロシージャ内のセミコロンを区切り文字として解釈しないようにします。なしで DELIMITER $$, 、含まれるストアドプロシージャを定義することはできません ; その中のステートメントを区切ります。手順の定義の期間中、セミコロンをグローバルに逃れる方法と考えることができます。

から ファインマニュアル:

再定義する mysql デリミッター、使用します delimiter 指図。次の例は、これを行う方法を示しています dorepeat() 表示されている手順。区切り文字が変更されます // 定義全体を単一のステートメントとしてサーバーに渡すことを有効にし、次に復元します ; 手順を呼び出す前に。これにより、 ; プロシージャ本文で使用されるデリミターは、によって解釈されるのではなく、サーバーに渡されるために使用されます mysql 自体。

私の説明がマニュアルよりも明確であるかどうかはわかりませんが、おそらくそのうちの1つ(または両方の組み合わせ)がある程度の理解につながるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top