Ich habe eine Reihe von SQL-Skripten, die die Datenbank aktualisieren sollte, wenn die Java-Webanwendung gestartet wird.Run Oracle SQL-Skript von Java
Ich habe versucht mit dem ibatis scriptrunner, aber es scheitert herrlich bei der Definition von Triggern, wo die ";" Zeichen markiert kein Ende der Aussage.
jetzt habe ich meine eigene Version eines Script-Runner geschrieben, der im Grunde genommen die Aufgabe erledigt, aber mögliche Formatierungen und Kommentare zerstört, besonders in "create or replace view".
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();
}
Gibt es einen sauberen Weg, dies zu erreichen? Gibt es etwas im Winterschlaf, das ich nicht gesehen habe? oder kann ich irgendwie einen Eingangsstrom an sqlplus übergeben? neben meinen Sorgen über die Formatierung bezweifle ich, dass dieser Code fehlerfrei ist, da ich begrenzte Kenntnisse über die pl/SQL-Syntax habe.
Ich verwende ibatis-common-2.jar und ich habe setDelimiter (String , boolean) Methode, Welche Version von iBatis verwenden Sie? –