Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过java代码执行Oracle sql脚本_Java_Sql_Oracle_Jdbc_Plsql - Fatal编程技术网

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

如何通过java代码执行Oracle sql脚本,java,sql,oracle,jdbc,plsql,Java,Sql,Oracle,Jdbc,Plsql,我是Oracle DB新手,正在使用Oracle 11g,我想通过java代码执行Oracle sql脚本。我的SQL脚本可能包含SQL语句(DDL或DML)或PL/SQL块,因此我不想在java代码中解析脚本,但更希望一次完成整个脚本。希望我的问题足够清楚,如果不让我知道,我可以澄清 iBatis能在我的场景中工作吗?我自己也没有尝试过,但这对你有用吗?这是PostgresDB的代码,但您也可以使用。我在那里找到了这个解决方案 import java.io.*; public class Cm

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


iBatis能在我的场景中工作吗?

我自己也没有尝试过,但这对你有用吗?这是PostgresDB的代码,但您也可以使用。我在那里找到了这个解决方案

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与资源结合使用。您可以编写一个简单的命令行工具,将脚本位置作为输入。这种方法的缺点是,您的代码将依赖于iBATIS(只使用一个特性的大框架依赖性)

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

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


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

一个选项是包含SQLcl并从java使用它

第一步。下载并解压缩SQLcl>

第二步。将所有内容添加到类路径

# 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 ---
第三步。编写一些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回购协议,该协议在此处完全实现了这一点:

Oracle db的命令是什么?尝试将
psql-U username-d dbname-h hserverhost-f
替换为
sqlplus hr/my\U hr_password@host_computer_name
这里还建议使用ProcessBuilder。我希望避免使用SQLplus或任何其他客户端来执行此操作。提到的解决方案适用于
插入的工作,
创建表格
。但对于具有
create或replace触发器的脚本
java.sql.SQLSyntaxErrorException:ORA-00900:invalid sql语句失败。任何线索为什么?找不到更好的解决方案,所以我用了这个:@samuel liew这不是一个骗局,因为这是针对Oracle的,您标记的是一个psql(postgres)