missing parameter type,调用存储过程的时候遇到这个问题,后来查看jdbc代码,发现是创建存储过程的时候,【是否入参出参】,【参数名称】和【参数类型】中间都要有个空格,不然java代码是无法正常执行的,但是直接命令执行存储过程是正常的。以后需要多注意。
存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `p`(IN `time_interval_minute` int,IN `start_time` datetime, OUT `flag` int)
BEGIN
set flag = 1;
insert into adm_bqhealth_cloud_test_di(
is_delete,
loadertime
) value (
'0',
now()
);
END
java代码调用存储过程加粗样式
import org.apache.commons.lang3.time.DateUtils;
import java.sql.*;
import java.util.Date;
/**
* @author xuleyan
* @version JdbcUtil.java, v 0.1 2020-08-20 4:35 下午
*/
public class JdbcUtil {
public static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";
private String dbUrl;
private String username;
private String password;
/**
* 获取数据库连接
*
* @return 数据库连接对象
* @author xly
*/
public static Connection getConnection(String dbUrl, String username, String password) {
Connection conn = null;
try {
// 加载数据库驱动类
Class.forName(DRIVER_CLASS);
System.out.println("数据库驱动加载成功");
// 获取数据库连接对象
conn = DriverManager.getConnection(dbUrl, username, password);
System.out.println("数据库连接成功");
} catch (Exception cnfe) {
cnfe.printStackTrace();
}
return conn;
}
//测试
public static void main(String[] args) {
JdbcUtil.execProcedure("jdbc:mysql://xxx:30306/xxx", "xxx", "xxx");
}
/**
* 调用存储过程
*
* @author xly
*/
public static void execProcedure(String dbUrl, String username, String password) {
Connection conn = null; // 数据库连接对象
CallableStatement clbStmt = null; // CallableStatement对象
ResultSet res = null; // 结果集对象
try {
// 获取数据库连接
conn = getConnection(dbUrl, username, password);
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.setInt(1, 15);
Date now = new Date();
cstmt.setTimestamp(2, new Timestamp(now.getTime()));
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three = cstmt.getInt(3);
System.out.println(three);
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
// 关闭数据库操作对象
closeOperate(res, clbStmt, conn);
}
}
/**
* 关闭数据库操作对象
*
* @param res ResultSet对象
* @param stmt Statement对象
* @param conn Connection对象
* @author xly
*/
public static void closeOperate(ResultSet res, Statement stmt, Connection conn) {
try {
// 关闭ResultSet对象
if (res != null) {
res.close();
}
// 关闭Statement对象
if (stmt != null) {
stmt.close();
}
// 关闭Connection对象
if (conn != null) {
conn.close();
}
System.out.println("关闭数据库操作对象完成");
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
}