【发布时间】:2010-09-17 01:30:24
【问题描述】:
我有一堆 sql 脚本应该在 java web 应用程序启动时升级数据库。
我尝试使用 ibatis 脚本运行程序,但在定义触发器时它失败了,其中“;”字符不标记语句的结束。
现在我已经编写了自己的脚本运行器版本,它基本上可以完成这项工作,但会破坏可能的格式和 cmets,尤其是在“创建或替换视图”中。
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 语法的了解有限。
【问题讨论】:
标签: java sql oracle scripting inputstream