我试图通过参数名称调用存储过程:
int processId = 1;
CallableStatement stmt = conn.prepareCall("{call get_process_log_latest(?)}");
stmt.setInt("process_id", processId);
但是setInt()抛出一个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';
确认存储过程的参数名称,并且该帐户具有元数据权限。
答案 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);