デリミタを使用している人がよくいます。区切り文字とは何か、その目的は何かを自分で調べました。20分間グーグルで検索した後、満足のいく答えを見つけることができませんでした。だから、私の質問は今です:区切り文字とは何ですか、いつ使用する必要がありますか?
デリミタを使用している人がよくいます。区切り文字とは何か、その目的は何かを自分で調べました。20分間グーグルで検索した後、満足のいく答えを見つけることができませんでした。だから、私の質問は今です:区切り文字とは何ですか、いつ使用する必要がありますか?
回答:
;
通常、デフォルト以外の区切り文字は、 複数のステートメントを定義する必要がある関数、ストアドプロシージャ、およびトリガーを定義するときに使用されます。$$
プロシージャ全体の終了を定義するために使用されるような別の区切り文字を定義しますが、その内部では、個々のステートメントはそれぞれで終了し;
ます。このようにして、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サーバーのバージョンに対応するマニュアルを確認してください
BEGIN...END
ブロックを持つストアドルーチンを作成すると、ブロック内のステートメントはセミコロンで終了し(;)
ます。ただし、CREATE PROCEDURE
ステートメントにはターミネータも必要です。したがって、ルーチンの本体内のセミコロンが終了CREATE PROCEDURE
するか、プロシージャの本体内のステートメントの1つが終了するかは、あいまいになります。
あいまいさを解決する方法は、MySQLクライアントがCREATE PROCEDURE
ステートメントの真のターミネーターとして認識する個別の文字列(プロシージャの本体内で発生してはならない)を宣言することです。
区切り文字は、Sqlステートメントへの入力が完了したことをMySQLクライアントに通知するために使用する文字または文字列です。
ステートメント、関数、ストアドプロシージャ、またはトリガーをステートメント全体として扱うようにmysqlクライアントに指示するには、DELIMITERを定義します。通常、.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 ;
区切り文字は、データベース内のデータ項目を区切るために使用されるSQLの文字です。文字列の始まりと終わりを識別します。通常、SQLで使用される区切り文字は「;」です。