У меня есть куча sql-скриптов, которые должны обновить базу данных при запуске java-приложения.run oracle sql script из java
Я пробовал использовать скрипт ibatis, но он не славен при определении триггеров, где «;» символ не обозначает конец инструкции.
Теперь я написал свою собственную версию бегуна сценария, которая в основном выполняет эту работу, но уничтожает возможное форматирование и комментарии, особенно в «создании или замене вида».
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.
Я использую ibatis-common-2.jar, и я не нашел setDelimiter (String , boolean), какую версию iBatis вы используете? – 2014-11-03 07:29:28