我是Oracle DB的新手,并且正在使用Oracle 11g,我想通过java代码执行Oracle sql脚本。我的SQL脚本可能包含SQL语句(DDL或DML)或PL / SQL块,所以我不想在我的java代码中解析脚本,而是希望一次性执行完整的脚本。希望我的问题很清楚,如果不让我知道,我可以澄清。
iBatis ScriptRunner会在我的情景中发挥作用吗?
答案 0 :(得分:1)
您可以考虑使用Liquibase,它是一个轻量级框架,用于以定义的方式执行数据库更改(DDL,DML)。其主要目标是支持数据库模式迁移。
只需添加一些包含liquibase关键字的注释,即可轻松将现有SQL脚本转换为liquibase脚本。见this example
我能想到的唯一缺点是liquibase使用另外两个表来记录有关已经执行的数据库更改的信息。
答案 1 :(得分:1)
一个选项是包含SQLcl并从java
中使用它步骤1.下载并解压缩SQLcl> http://www.oracle.com/technetwork/developer-tools/sqlcl/downloads/index.html
步骤2.将所有内容添加到类路径
# all files in sqlcl/lib/*
# adjust to your install ( unzip ) of sqlcl
LIB=sqlcl/lib/
CP=
for f in $(ls $LIB/*.jar); do
echo $f
CP=$CP:$f
done
echo --- $CP ---
步骤3.编写一些java
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE","klrice","klrice");
//#get a DBUtil but won't actually use it in this example
DBUtil util = DBUtil.getInstance(conn);
//#create sqlcl
ScriptExecutor sqlcl = new ScriptExecutor(conn);
// Capture the results without this it goes to STDOUT
ByteArrayOutputStream bout = new ByteArrayOutputStream();
BufferedOutputStream buf = new BufferedOutputStream(bout);
sqlcl.setOut(buf);
//#setup the context
ScriptRunnerContext ctx = new ScriptRunnerContext();
//#set the context
sqlcl.setScriptRunnerContext(ctx);
ctx.setBaseConnection(conn);
//# run a whole file
sqlcl.setStmt("@myfile.sql");
sqlcl.run();
//#run 1 statement
sqlcl.setStmt("select * from user_objects");
sqlcl.run();
String results = bout.toString("UTF8");
System.out.println(results);
在这里更新了一个完成此操作的GitHub仓库: https://github.com/oracle/oracle-db-tools/tree/master/sqlcl/java
答案 2 :(得分:0)
我自己没试过,但这对你有用吗?它是PostgresDB的代码,但您也可以使用Oracle SQL Command Line。 Here is the link我找到了这个解决方案。
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec
("psql -U username -d dbname -h serverhost -f scripfile.sql");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
}
}
答案 3 :(得分:0)
我假设您要运行一些“一次性脚本”来创建初始数据库设置。如果是这种情况,则mvieghofer提供的解决方案可以正常工作,但它假定您已在系统路径中安装并提供了psql工具。因此,这对您的开发系统提出了一些要求。
更好,更便携的解决方案是将ibatis scriptrunner与Resource结合使用。您可以编写一个简单的命令行工具,将脚本位置作为输入。这种方法的缺点是你的代码依赖于Ibatis(大型框架依赖只能使用一个特性)