tengo un conjunto de scripts sql que deberían actualizar la base de datos cuando se inicia la aplicación web java.ejecute el script sql de Oracle desde java
intenté usar el scriptrunner ibatis, pero falla gloriosamente al definir desencadenadores, donde el ";" el personaje no marca un final de declaración.
ahora he escrito mi propia versión de un script runner, que básicamente hace el trabajo, pero destruye posibles formatos y comentarios, especialmente en "crear o reemplazar vista".
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();
}
¿hay alguna manera limpia de conseguir esto? ¿Hay algo en Hibernate que no haya visto? o puedo pasar un inputstream a sqlplus de alguna manera? además de mis preocupaciones sobre el formateo, dudo que este código esté libre de errores, ya que tengo conocimiento limitado sobre la sintaxis pl/sql.
Estoy usando ibatis-common-2.jar y no he encontrado setDelimiter (String , boolean) method, ¿Qué versión de iBatis estás usando? –