如何使用 JDBC 执行过程

Posted

技术标签:

【中文标题】如何使用 JDBC 执行过程【英文标题】:How to execute a procedure with JDBC 【发布时间】:2017-02-02 08:48:07 【问题描述】:

这是我的功能:

public static void execute_delete_on_db(String pass, String login, String port,
        String host, String table_name, String file_path) throws Exception 

    Class.forName("oracle.jdbc.OracleDriver");
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//"
            + host + ":" + port + "/xe", login, pass);

    PreparedStatement statement = null;

    Statement stmt = null;
    String query = "delete from AA_ALL";
    stmt = conn.createStatement();
    stmt.executeQuery(query);
    sql_statement.close();
    conn.commit();
    conn.close();

至少这是我职能中最重要的部分。上面的代码工作正常。我试图通过调用这个 sql 语句来执行我的过程:

  EXECUTE delete_all_rows_from_table('all');

在 Java 中它看起来像这样:

String query = "EXECUTE delete_all_rows_from_table('all')";

在数据库上它工作正常,但在 Java 中这给了我错误。 你能告诉我我做错了什么吗?

【问题讨论】:

阅读文档docs.oracle.com/cd/E17952_01/connector-j-en/… 你遇到什么错误? @JIV 在涉及 Oracle 数据库时链接到 mysql 文档? @Gimby 其实在 JDBC 中调用 oracle 或 mysql 的过程是一样的 @Gimby:没关系,java代码是一样的。 JDBC 是 API 标准。 【参考方案1】:

你可以call你的程序而不是像这样执行它:

String query = "call delete_all_rows_from_table(?)"; 
CallableStatement statement = connection.prepareCall(query);  
statement.setString(1, "all");  
statement.execute(); 

您可以在这里了解更多信息:JDBC CallableStatement – Stored Procedure OUT parameter example 和 JDBC Stored Procedure

【讨论】:

【参考方案2】:

注意如果程序有一些输出参数,你必须注册参数。 这是一个示例,假设我们已经导入了模块(java.sql.CallableStatement 和 java.sql.Types)并且已经建立了连接。

CallableStatement callStmt = conn.prepareCall("CALL <PROCEDURE_NAME>(?, ?, ?)");
callStmt.setString(1, data);
callStmt.registerOutParameter(2, Types.VARCHAR);
callStmt.registerOutParameter(3, Types.VARCHAR);
callStmt.executeQuery();

String outParameter1 = callStmt.getString(2);
String outParamenter2 = callStmt.getString(3);

【讨论】:

以上是关于如何使用 JDBC 执行过程的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 调用 PostgreSQL 存储过程

如何在jdbc中执行oracle程序

如何使用 JDBC 调用存储在数据库中的函数或存储过程

mybatis源码解析之如何调用JDBC的预处理器Statement完成交互

mybatis源码解析之如何调用JDBC的预处理器Statement完成交互

如何使用 clojure jdbc 执行?