MySQL 接続時にバッチファイルを指定してバッチ処理を実行する
MySQL へ接続する際に、パラメータでバッチファイルのパスを指定することで、バッチファイルに記述された一連の処理を実行することができます。
mysql 各種オプション < バッチファイルパス
バッチファイル読み込み時には、-v オプションや -f オプションを使用することで一部動作を変更することができますが、詳細については後述します。
通常の実行方法
バッチファイルのパスは絶対パスでも相対パスでも構いません。ファイル名だけを指定した場合は、mysql へ接続する際にいるフォルダ(ディレクトリ)のファイルを読み込みます。
実際に実行して試してみる為、次のような内容で「batch_test.sql」という名前のバッチファイルを用意します。
/* 使用するデータベースを選択 */ USE TEST; /* TEST1 テーブルの件数を確認 */ SELECT COUNT(*) FROM TEST1; /* 現在日時を取得 */ SELECT NOW();
上記のファイルを読み込んで処理を実行してみます。
D:\temp>mysql -u taro -p < batch_test.sql Enter password: **** COUNT(*) 4 NOW() 2014-12-18 00:29:49 D:\temp>
処理結果は上記のように標準出力に表示されます。もし、出力結果をファイルに出力したい場合はリダイレクトを使用します。具体的な方法については次のページを参照してください。
尚、接続後にバッチファイルを読み込んで処理を実行する場合は source コマンドを実行します。詳細は次のページを参照してください。
-v オプションで実行した SQL を表示する
接続時にバッチファイルを読み込む場合、実行結果だけを見ると、どの結果がどの SQL の処理結果なのかが分かりにくいことがあります。こういう場合、 -v オプションを使用すると実行した SQL と実行結果を明確に対応付けることができるようになります。
先ほどの例で使用したファイルと同じバッチファイルを -v オプションを実行して試してみます。
D:\temp>mysql -u taro -p -v < batch_test.sql Enter password: **** -------------- SELECT COUNT(*) FROM TEST1 -------------- COUNT(*) 4 -------------- SELECT RAND() -------------- RAND() 0.46490467383051726 D:\temp>
上記の通り、 -v オプションで実行した SQL も表示されるようになりました。
-f オプションでエラーが発生しても処理中止しない
バッチ処理の場合、通常は途中でエラーが発生すると、そこで処理が中断します。実行して試してみるため、次のようなバッチファイル(batch_test.sql)を用意します。
/* 使用するデータベースを選択 */ USE TEST; /* スペルミスでエラー発生 */ SELECT COUNT(*) FROMM TEST1; /* 現在日時を取得 */ SELECT NOW();
上記ファイルを -f 無しで実行した場合は、エラーが発生した時点で処理を中断します。
D:\temp>mysql -u taro -p -v < batch_test.sql Enter password: **** -------------- SELECT COUNT(*) FROMM TEST1 -------------- ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the ma nual that corresponds to your MySQL server version for the right syntax to use n ear 'TEST1' at line 1 D:\temp>
これに対して -f オプションを使用すると、エラーが発生しても中断せずに最後まで処理を実行します。
次の例では、エラーが発生した後の SELECT NOW() まで実行していることが分かります。
D:\temp>mysql -u taro -p -v -f < batch_test.sql Enter password: **** -------------- SELECT COUNT(*) FROMM TEST1 -------------- ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the ma nual that corresponds to your MySQL server version for the right syntax to use n ear 'TEST1' at line 1 -------------- SELECT NOW() -------------- NOW() 2014-12-18 01:04:27 D:\temp>