如何从java执行sql文件
我有一个带有多个查询和表的ORACLE SQL sctipt,我希望在程序开始时从java程序运行该脚本,以确保一切都在正确的位置。我找到了一个运行脚本的代码,但由于某些原因它不起作用。有谁能给我提供样品,以便我能跟踪 这就是我发现的:如何从java执行sql文件,java,sql,oracle,jdbc,io,Java,Sql,Oracle,Jdbc,Io,我有一个带有多个查询和表的ORACLE SQL sctipt,我希望在程序开始时从java程序运行该脚本,以确保一切都在正确的位置。我找到了一个运行脚本的代码,但由于某些原因它不起作用。有谁能给我提供样品,以便我能跟踪 这就是我发现的: try { String line; Process p = Runtime.getRuntime().exec ("psql -U sas -d oracle -h @localhost -f Lab_05_Tables.sql");
try {
String line;
Process p = Runtime.getRuntime().exec ("psql -U sas -d oracle -h @localhost -f Lab_05_Tables.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();
}
但是它不起作用
错误
java.io.IOException: Cannot run program "psql": CreateProcess error=2, The system
cannot find the file specified
您试图从代码中运行外部程序,这不是一个好的解决方案 如果使用Ant,则可以在Ant中使用
sql
task:
如果您不使用Ant,您应该只使用常规jdbc连接。您可能正在运行EnterpriseDB Postgres Plus Advanced Server,这将允许您使用psql运行Oracle代码。文件名“Lab_05_Tables.sql”暗示了一种教育环境,因此如果我不恰当地将您视为新手,请原谅 在Java中实现这一点之前,您应该让已执行语句在命令行中自行运行
psql -U sas -d oracle -h @localhost -f Lab_05_Tables.sql
这里很多事情都可能出错,你需要弄清楚这一点。命令行表明,您希望在运行数据库服务器并安装了数据库客户端的同一台服务器上运行java程序,并且使用用户名“sas”登录到名为“oracle”的数据库,而不需要密码。如果其中任何一个都不正确,那么在使用Java应用程序之前,您应该在数据库上找到设置帮助。我将省略“-h@localhost”
如果您确定所有这些都有效,并且问题的范围只是让Java执行您的命令,那么您可能只需要将psql添加到PATH环境变量中。如果您有资源,将SQL从脚本移植到Java程序本身会更好
请参阅Java。什么不起作用?您有错误吗?
psql
PostgreSQL命令行不是吗?它也能处理Oracle吗?问题是您举的示例使用的是用于PostgreSQL脚本的程序psql,而不是Oracle。错误表明找不到psql
。可能需要指定完整路径。psql能否处理Oracle也是个疑问。您可能需要sqlplus
。或者使用sqlplus,或者更好地使用JDBC()psql
是用于PostgreSQL的,如果只安装了Oracle,它将不可用-如果是,它将无法连接到Oracle。(sqlplus的参数完全不同)我明白了,普通开源PostgreSQL也是如此,它与我提到的产品不同。看,在java程序中编写SQL是个坏主意!每次更改SQL语句或数据库架构时,都需要重新编译程序。@GETah您将如何参数化程序外的SQL?例如,如果您添加了新表列,那么如何在JDBC SQL的WHERE new_table=?
部分中使用它?它可以使用一些元数据语言来完成,但大多数时候我不需要这么复杂,因为,无论如何,对DB方案的每一次更改都是因为Java代码中添加了新的特性,所以无论如何都需要重新编译它。不过,如果您需要,仍然可以这样做。我宁愿将SQL语句放在文本文件中。设想一个场景,您需要重命名数据库中的表。在这种情况下,代码不需要重新编译,而在生产代码中直接嵌入SQL时则不需要重新编译。