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

时间:2013-12-20 09:15:15

标签: java sql oracle jdbc plsql

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

iBatis ScriptRunner会在我的情景中发挥作用吗?

4 个答案:

答案 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 LineHere 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(大型框架依赖只能使用一个特性)