複数のSQLを一度に実行するためのスクリプト

LONERさん
LONERさん

Oracle では、PL/SQL や CREATE 文 をファイルにしておいて、ファイルにしたスクリプトを実行することができる。
(Windows では、)plsql を開き、@マークの後にファイル名を続けて書いて Enter を押せばOKだ。
@"C:\Program Files\xxx.sql"
(Program Files の下にスクリプトをおくことはないだろうが、)上のような感じになる。

それでは、ファイルが複数ある場合はどのようにすればよいだろうか。ひとつずつファイルを入力するのもひとつだが、それだと時間も手間もかかる。そこで、次のようなスクリプトを使用して一括でスクリプトを実行するためのファイルを作る。(Windows 限定)(普段はもうちょっと別のことをやるためにForTablesという定数・引数をつかっていろいろやっているため、引数にForScripts, ForTables があるが、とりあえず下記のまま実行すればOK)
下のスクリプトは、拡張子を .js にして 保存しておく。




// 指定されたフォルダ内のスクリプトを全て実行するためのスクリプトを生成する。
// スクリプトファイルは拡張子(末尾が.sql)で判定する。

//定数の宣言
var ForReading = 1; //読み込み
var ForWriting = 2; //書きこみ(上書きモード)
var ForAppending = 8; //書きこみ(追記モード)

// スクリプト実行モード
var ForScripts = 0;
var ForTables = 1;

var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var currentFolderPath = String(WScript.ScriptFullName).replace(WScript.ScriptName, "");

editFile(currentFolderPath, ForScripts, "_out.sql");

ForReading = null;
ForWriting = null;
ForAppending = null;
ForTables = null;
ForScripts = null;
objFileSys = null;
currentFolderPath = null;
outPutFileName = null;

/* 指定されたフォルダのスクリプト全てを実行するためのファイルを
* 生成する。
* 引数は
* フォルダパス
* 生成モード
* (スクリプトを実行するだけなら 0, 今のテーブルを変更するなら 1)
* 生成されるスクリプトのファイル名
*/
function editFile(folderPath, mode, outPutFileName) {
if (!folderPath.match(/\\$/)) {
folderPath += '\\';
}
var objOutFile;
var tableName = '';

var folder = objFileSys.GetFolder(folderPath);
var files = new Enumerator(folder.Files);

try {
objOutFile = objFileSys.CreateTextFile(folderPath + outPutFileName , true);
for (; !files.atEnd(); files.moveNext()) {
if (files.item().Path.match(/\.sql$/) &&
!files.item().Path.match(outPutFileName)) {
switch (mode) {
case ForScripts:
objOutFile.WriteLine('@"' + files.item().Path + '"');
break;
case ForTables:
tableName = files.item().Path.replace(/^.*\\([a-zA-Z_\d]*)\.sql/g, "$1");
objOutFile.WriteLine('CREATE TABLE ' + tableName + '_BK AS SELECT * FROM ' + tableName + ';');
objOutFile.WriteLine('DROP TABLE ' + tableName + ';');
objOutFile.WriteLine('@"' + files.item().Path + '"');
objOutFile.WriteLine('EXEC P_MOVE_TABLE_ITEM(\'' + tableName + '_BK\', \'' + tableName + '\');');
objOutFile.WriteLine('DROP TABLE ' + tableName + '_BK;');
objOutFile.WriteLine();
break;
}
}
}
objOutFile.Close();

} catch(e) {
WScript.echo("Error!");
WScript.echo(folderPath + outPutFileName);
} finally {
objOutFile.Close();
}

objOutFile = null;
strScriptPath = null;

return 0;
}


SyntaxHighlighter.all();

そして、このスクリプトと同じフォルダに、実行したいスクリプトをすべて入れておく(拡張子は.sqlにすること)。実行したいスクリプトがそろったら、スクリプトファイル(.js)をダブルクリックする。すると _out.sql というファイル名で実行すべきファイルが出来上がる。
最後に @"_out.sql" を実行すれば、すべてのスクリプトが一括で実行される。

エラーのログなどをとりたい場合はどうすればいいんだろうか??(・へ・;)
LONERさんのブログ一覧