189

デリミタを使っている人をよく見かけます。区切り文字とは何か、その目的は何かを調べてみました。20分間のグーグル検索の後、満足のいく答えを見つけることができませんでした. だから、私の質問は次のとおりです: 区切り記号とは何ですか?いつ使用する必要がありますか?

4

4 に答える 4

272

デフォルト以外の区切り文字 ;は、通常、複数のステートメントを定義する必要がある関数、ストアド プロシージャ、およびトリガーを定義するときに使用されます。$$プロシージャ全体の終わりを定義するために使用されるような別の区切り文字を定義しますが、その内部では、個々のステートメントはそれぞれ;. そうすれば、コードがmysqlクライアントで実行されるときに、クライアントは手順全体が終了する場所を認識し、内部の個々のステートメントを実行するのではなく、ユニットとして実行できます。

DELIMITERキーワードは、コマンド ラインmysqlクライアント (およびその他のクライアント) のみの機能であり、通常の MySQL 言語機能ではないことに注意してください。プログラミング言語 API を介して MySQL に渡そうとしても機能しません。PHPMyAdmin などの他のクライアントには、デフォルト以外の区切り文字を指定する別の方法があります。

例:

DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$

/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN    
  /* Inside the procedure, individual statements terminate with ; */
  CREATE TABLE tablea (
     col1 INT,
     col2 INT
  );

  INSERT INTO tablea
    SELECT * FROM table1;

  CREATE TABLE tableb (
     col1 INT,
     col2 INT
  );
  INSERT INTO tableb
    SELECT * FROM table2;
  
/* whole procedure ends with the custom delimiter */
END$$

/* Finally, reset the delimiter to the default ; */
DELIMITER ;

DELIMITERサポートしていないクライアントで使用しようとすると、サーバーに送信され、構文エラーが報告されます。たとえば、PHP と MySQLi を使用する場合:

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

エラー:

SQL 構文にエラーがあります。1行目の「DELIMITER $$」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

于 2012-04-21T13:54:59.307 に答える
24

DELIMITER ステートメントは、セミコロン (;) である標準の区切り文字を別のものに変更します。区切り文字がセミコロン ( ;) からダブルスラッシュ // に変更されます。

区切り文字を変更する必要があるのはなぜですか?

mysql ツールに各ステートメントを一度に解釈させるのではなく、ストアド プロシージャ、カスタム関数などをサーバー全体に渡したいためです。

于 2015-02-02T09:28:23.220 に答える
11

DELIMITER を定義して、ステートメント、関数、ストアド プロシージャ、またはトリガーをステートメント全体として扱うように mysql クライアントに指示します。通常、.sql ファイルでは、$$ のような別の DELIMITER を設定します。DELIMITER コマンドは、MySQL コマンドの標準の区切り文字 (つまり ;) を変更するために使用されます。ルーチン (関数、ストアド プロシージャ、またはトリガー) 内のステートメントはセミコロン (;) で終わるため、それらを複合ステートメントとして扱うには、DELIMITER を使用します。同じファイルまたはコマンド ラインで異なるルーチンを使用するときに定義されていない場合、構文エラーが発生します。

さまざまな非予約文字を使用して、独自のカスタム区切り文字を作成できることに注意してください。バックスラッシュ (\) 文字は MySQL のエスケープ文字であるため、使用しないでください。

DELIMITER は実際には MySQL 言語コマンドではなく、クライアント コマンドです。

DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
    
    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;
于 2017-12-06T14:37:54.600 に答える