CallableStatement setInt命名参数异常

时间:2017-04-02 00:48:49

标签: java mysql jdbc named-parameters callable-statement

我试图通过参数名称调用存储过程:

int processId = 1;
CallableStatement stmt = conn.prepareCall("{call get_process_log_latest(?)}");
stmt.setInt("process_id", processId);

但是setInt()抛出一个NullPointerException:

NullPointerException

但是,stmt不为null;从第1381行的getNamedParamIndex()方法在第2065行的setInt()中抛出异常。

存储过程:

DELIMITER $$
CREATE PROCEDURE `get_process_log_latest`(
    IN process_id INT
)
BEGIN
    SELECT
        id,
        start_time,
        end_time
    FROM process_logs pl
    WHERE pl.process_id = process_id
    ORDER BY id DESC
    LIMIT 1;
END$$
DELIMITER ;

我使用的是JDK 8,mysql-connector-java-5.1.38和MySQL 5.7.12。

你知道我可能做错了吗?

更新

使用Java使用的帐户验证到MySQL并使用

SELECT * FROM information_schema.parameters   
WHERE parameter_name = 'process_id';

确认存储过程的参数名称,并且该帐户具有元数据权限。

1 个答案:

答案 0 :(得分:0)

这是CallableStatements需要遵循的两件事

操作:

int processId = 1;
CallableStatement stmt = conn.prepareCall("{call get_process_log_latest(?)}");
stmt.setInt(1, processId); 

命名参数:

int processId = 1;
CallableStatement stmt = conn.prepareCall("{call get_process_log_latest(:process_id)}");
stmt.setInt("process_id", processId);

如果要在可调用语句中添加多个命名的参数,则

int processId = 1;
CallableStatement stmt = conn.prepareCall("{call get_process_log_latest(:process_id, :process_name)}");
stmt.setInt("process_id", processId);
stmt.setString("process_name", processName);