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