如何从java执行sql文件

Posted

技术标签:

【中文标题】如何从java执行sql文件【英文标题】:How to execute sql file from java 【发布时间】:2011-11-29 01:00:53 【问题描述】:

我有一个包含多个查询和表的 ORACLE SQL 脚本,我想在程序开始时从我的 java 程序运行该脚本,以确保一切都在正确的位置。我找到了运行脚本的代码,但由于某种原因它不起作用。任何人都可以提供样品,以便我可以遵循它。

这是我发现的:

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

【问题讨论】:

什么不起作用?你有错误吗? psql 不是 PostgreSQL 命令行吗?它也能处理 Oracle 吗? 问题是你举的例子是使用用于PostgreSQL脚本的程序psql,而不是Oracle。 错误提示找不到psql。也许您需要指定完整路径。而且 psql 能否处理 Oracle 是值得怀疑的。你可能想要sqlplus 要么使用sqlplus,要么使用JDBC (razorsql.com/articles/oracle_jdbc_connect.html) 【参考方案1】:

如果您有资源,将 SQL 从您的脚本移植到 Java 程序本身会更好。

请参阅 Java JDBC tutorial。

【讨论】:

在你的java程序中写SQL是个坏主意!每次更改 SQL 语句或数据库架构时,都需要重新编译程序。 @GETah 您将如何参数化程序之外的 SQL?例如,如果您添加了新的表列,如何在 JDBC 的 SQL 的 WHERE new_table = ? 部分中使用它?它可以使用一些元数据语言来完成,但大多数时候我不需要这种复杂程度,因为无论如何,对 DB 方案的每次更改都是因为 Java 代码中添加了新特性,所以你需要重新编译它反正。不过,如果您需要,仍然可以完成。 我宁愿将我的 SQL 语句放在一个文本文件中。想象一个场景,您需要重命名数据库中的表。在这种情况下,代码不需要重新编译,而当您将 SQL 直接嵌入到生产代码中时,情况并非如此。【参考方案2】:

您正试图从您的代码中运行外部程序,这不是一个好的解决方案。

如果你使用Ant,你可以在Ant中使用sql任务:http://ant.apache.org/manual/Tasks/sql.html

如果你不使用 Ant,你应该只使用常规的 jdbc 连接。

【讨论】:

【参考方案3】:

您可能正在运行 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 环境变量中。

【讨论】:

psql 用于 PostgreSQL,如果只安装了 Oracle,它将不可用 - 如果是,它将无法连接到 Oracle。 (和 sqlplus 的参数完全不同) 我明白了,对于普通的开源PostgreSQL也是如此,与我提到的产品不同。见enterprisedb.com/products-services-training/products/…。

以上是关于如何从java执行sql文件的主要内容,如果未能解决你的问题,请参考以下文章

执行 .sql 文件时如何获取 oracle 错误

从入门到深入!java根据文件路径下载文件

如何将文本文件中的数据从Java插入SQL Server?

如何在Unix中的java中执行sql脚本文件

Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入

如何使用 python 从 .sql (mysqldump) 文件中执行“创建表查询”