java - 从 Java 调用 SQL 包过程

标签 java sql oracle

我有一个 Oracle SQL 过程,我想从我的 Java 代码中调用它,但我不太清楚如何做到这一点。我知道我的程序运行良好,因为当我在 SQLDeveloper 中使用它们时没有任何问题。当我从 Java 代码调用时,我收到 SQLSyntaxErrorException:无效的 SQL 语句。

这是我到目前为止的代码...

private DataSource datasource;

private static final Map<String, String> SQL_KEYS = new HashMap<String, String>();

static {
    SQL_KEYS.put("updatePassword", 
            "EXEC MY_VIEW_SECURITY.CHANGE_PASSWORD(?, ?, ?)");
}

public void updatePassword(String username, String old_password, String new_password) throws SQLException {
    Connection con = null;
    CallableStatement cstmt = null;

    try {
        con = datasource.getConnection();
        cstmt = con.prepareCall(SQL_KEYS.get("updatePassword"));

        cstmt.setString(1, username);
        cstmt.setString(2, old_password);
        cstmt.setString(3, new_password);

        cstmt.executeUpdate();      

    } catch(Exception ex) {
        ex.printStackTrace();
    } finally {
        con.close();
        cstmt.close();
    }
}

我的 Java 代码的 updatePassword 字符串语法是否不正确,因为它在 SQLDeveloper 中工作正常?

我尝试在语句中将 EXEC 切换为 CALL,该语句给出了 SQLSyntaxErrorException:从属 session 中不允许 COMMIT。我不确定这是否是朝着正确方向迈出的一步。

最佳答案

EXEC 不是 SQL command所以你不能从 JDBC 使用它。

run a stored procedure准备CallableStatement时需要使用{call ...}:

cstmt = con.prepareCall("{call Y_VIEW_SECURITY.CHANGE_PASSWORD(?, ?, ?)}");
cstmt.setString(1, username);
cstmt.setString(2, old_password);
cstmt.setString(3, new_password);

注意 {} 是传递给 prepareCall() 的字符串的一部分

关于java - 从 Java 调用 SQL 包过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844664/

相关文章:

c# Entity Framework 抛出异常但不回滚数据库

Visual Studio 中的 SQL 文件编码

java - Android/Node.js - Android 应用程序中的字符串 '@' 在 Node.js 中变为 '%40'

java - 基本 Java 数组 - 打印递增值的 "Pyramid"

java - 如何在 Spring Roo/Dojo 中做一个非强制性的下拉框?

java - 想要在定制映射时引用其他映射器

mysql - 意想不到的性格。 (在位置 1093 的 ":"附近)

sql - Like 从句的模式匹配

java - 获取 Oracle DB 中插入行的最后一个 ID

java - 想使用JConsole进行性能测试