Unable to retrieve metadata for procedure

文章详细介绍了使用JDBC调用MySQL存储过程时遇到的一个常见错误,即忘记添加调用关键字'call'导致无法获取元数据的问题,并通过查看源代码找到了解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次用jdbc调用mysql存储过程的过程中犯了一个严重的错误:(对本人来说)
代码如下:

PreparedStatement call = con.prepareCall("{proc_card_vouc(?,?,?,?)}");

启动应用程序时,控制台报出:
java.sql.SQLException: Unable to retrieve metadata for procedure.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.CallableStatement.extractProcedureName(CallableStatement.java:868)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:699)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4583)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4657)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4631)
at com.sunyard.dao.AccountDAOImpl.account(AccountDAOImpl.java:34)
at com.sunyard.dao.AccountDAOImpl.main(AccountDAOImpl.java:87)

当时一下在懵了,去网上百度下,始终没发现问题。后来实在无奈,是查看了com.mysql.jdbc.CallableStatement.extractProcedureName这个方法,发现里面一段代码:int endCallIndex = StringUtils.indexOfIgnoreCase(sanitizedSql,"CALL "); 原来自己传入的参数少一个 call,真是太不小心了。

结论:查看源代码有时候还是很有作用的 ,以后要好好养成习惯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值