Oracle では、PL/SQL や CREATE 文 をファイルにしておいて、ファイルにしたスクリプトを実行することができる。
(Windows では) plsql を開き、下のように@マークの後にファイル名を続けて書いて Enter を押せば OK だ。
@"C:Folderxxx.sql"
それでは、ファイルが複数ある場合はどのようにすればよいだろうか。ひとつずつファイルを入力するのもひとつだが、それだと時間も手間もかかる。そこで、次のようなスクリプトを使用して一括でスクリプトを実行するためのファイルを作る。 (Windows 限定) (普段はもうちょっと別のことをやるために ForTables
という定数・引数をつかっていろいろやっているため、引数に ForScripts
, ForTables
があるが、とりあえず下記のまま実行すればOK)
下のスクリプトは、拡張子を .js にして 保存しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
// 指定されたフォルダ内のスクリプトを全て実行するためのスクリプトを生成する。 // スクリプトファイルは拡張子(末尾が.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; } |
そして、このスクリプトと同じフォルダに、実行したいスクリプトをすべて入れておく(拡張子は.sqlにすること)。実行したいスクリプトがそろったら、スクリプトファイル(.js)をダブルクリックする。すると _out.sql というファイル名で実行すべきファイルが出来上がる。
最後に @”_out.sql” を実行すれば、すべてのスクリプトが一括で実行される。
補足
ForScripts
は プロシージャ などのCREATE OR UPDATE
で始まるスクリプトに使います。ForTables
はCREATE TABLE
で始まるテーブル作成文に使います。 ファイル名はCREATE_TABLENAME.sql
のようにしておきます。
複数フォルダに プロシージャ、ファンクション、テーブルなどと分けて格納している場合は次のようにしてすべてのフォルダのスクリプト実行用ファイルを作ります。
1 2 3 |
editFile(currentFolderPath & "Table", ForTables, "out/Table.sql"); editFile(currentFolderPath & "Procedure", ForScripts, "out/Procedure.sql"); editFile(currentFolderPath & "Function", ForScripts, "out/Function.sql"); |