Java Web アプリケーションの起動時にデータベースをアップグレードする SQL スクリプトがたくさんあります。
ibatis scriptrunner を使用してみましたが、トリガーを定義するときに見事に失敗します。文字はステートメントの終わりを示しません。
これは基本的には機能しますが、特に「ビューの作成または置換」で可能なフォーマットとコメントを破壊します。
public class ScriptRunner {
private final DataSource ds;
public ScriptRunner(DataSource ds) {
this.ds = ds;
}
public void run(InputStream sqlStream) throws SQLException, IOException {
sqlStream.reset();
final Statement statement = ds.getConnection().createStatement();
List<String> sqlFragments = createSqlfragments(sqlStream);
for (String toRun : sqlFragments) {
if (toRun.length() > 0) {
statement.execute(toRun);
}
}
}
private static List<String> createSqlfragments(InputStream sqlStream) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(sqlStream));
List<String> ret = new ArrayList<String>();
String line;
StringBuilder script = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.equals("/")) {
ret.add(removeMultilineComments(script));
script = new StringBuilder();
} else {
//strip comments
final int indexComment = line.indexOf("--");
String lineWithoutComments = (indexComment != -1) ? line.substring(0, indexComment) : line;
script.append(lineWithoutComments).append(" ");
}
}
if (script.length() > 0) {
ret.add(removeMultilineComments(script));
}
return ret;
}
private static String removeMultilineComments(StringBuilder script) {
return script.toString().replaceAll("/\\*(.*?)\\*/", "").trim();
}
これを達成するためのきれいな方法はありますか?私が見たことのない休止状態に何かがありますか?または、何らかの方法で入力ストリームを sqlplus に渡すことはできますか? 書式設定に関する私の懸念に加えて、pl/sql 構文に関する知識が限られているため、このコードにエラーがないかどうかは疑問です。