如何通过java代码执行Oracle sql脚本

我是Oracle DB的新手,并且正在使用Oracle 11g,我想通过java代码执行Oracle sql脚本。 我的SQL脚本可能包含SQL语句(DDL或DML)或PL / SQL块,所以我不想在我的java代码中解析脚本,而是希望一次性执行完整的脚本。 希望我的问题很清楚,如果不让我知道,我可以澄清。

iBatis ScriptRunner会在我的场景中工作吗?

您可以考虑使用Liquibase ,它是一个轻量级框架,用于以定义的方式执行数据库更改(DDL,DML)。 其主要目标是支持数据库模式迁移。

只需添加一些包含liquibase关键字的注释,就可以轻松地将现有SQL脚本转换为liquibase脚本。 看这个例子

我能想到的唯一缺点是liquibase使用两个额外的表来记录有关已经执行的数据库更改的信息。

一种选择是包含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

我自己没试过,但这对你有用吗? 它是PostgresDB的代码,但您也可以使用Oracle SQL命令行 。 这是我找到这个解决方案的链接 。

 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(); } } } 

我假设您要运行一些“一次性脚本”来创建初始数据库设置。 如果是这种情况,则mvieghofer提供的解决方案可以正常工作,但它假定您已在系统路径中安装并提供了psql工具。 因此,这对您的开发系统提出了一些要求。

更好,更便携的解决方案是将ibatis scriptrunner与Resource结合使用。 您可以编写一个简单的命令行工具,将脚本位置作为输入。 这种方法的缺点是您的代码将依赖于Ibatis(大型框架依赖只使用一个function)