コメントから:
それはそれがどのように機能するかではありません。
理由を理解するには、mysql
がどのように機能するかを理解する必要があります CLI(およびこのようなダンプファイルを読み取って実行できるその他のプログラム)は、実際にそれを処理します。
DELIMITER
サーバーが理解できるものではありません。
DELIMITER
クライアント側パーサーに通知するために使用されます クライアント側のパーサーがステートメントを正しく分割し、実行のためにサーバーに一度に1つずつ配信できるように、現在のステートメント区切り文字をどのようにする必要がありますか。
ドキュメントから。 mysql
に注意してください 、ここで使用されるたびに、mysql
を参照します クライアントユーティリティ -サーバーではありません。
したがって、このようなファイルを処理するには、同じことを行うクライアント側のパーサーが必要ですmysql
します...そしてここで、あなたが書いているコードはです (必要)クライアント側のステートメントパーサー。したがって、区切り文字を処理するロジックを作成する必要があるのはあなたです。
やりたいことをするためには、DELIMITER
を解釈する必要があります ステートメントは、現在のステートメント区切り文字を追跡するために使用しますが、サーバーには送信しないでください。
次に、入力を一度に1行ずつ読み取り、読み取った内容をバッファリングして、行の終わりに指定された区切り文字が見つかるまで、結果のステートメントをサーバーに送信する必要があります- except < 送信するものからの実際のステートメント区切り文字...したがって、たとえば、末尾の$$
は送信しません。 プロシージャ本体の後(現在のステートメント区切り文字が;
でない場合) 、送信することも送信しないこともできます。サーバーは関係ありません。)次に、バッファーを空にして、区切り文字の別のインスタンスが表示されるまで(そして、ステートメントをサーバーに送信するまで)、またはDELIMITER
ステートメントを作成し、コードの現在の区切り変数をそれに一致するように設定して、次のステートメントの終わりを正しく識別できるようにします。