在Oracle开发中进行数据插入的操作,代码是可以完全执行的,到了Mysql方法下 ,却报插入失败的操作。具体报错信息如下:
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:857)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:692)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4520)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4594)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4568)
at com.caucho.sql.UserConnection.prepareCall(UserConnection.java:427)
at com.whir.cms.prjs.chaoHuGov.lwzzMessage.LWMessageServiceImpl.addRecordMessage(LWMessageServiceImpl.java:90)
at _jsp._lwzt._index__jsp._jspService(_index__jsp.java:1048)
at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
at com.caucho.jsp.Page.pageservice(Page.java:578)
at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:195)
at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:148)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:273)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:743)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:662)
at java.lang.Thread.run(Thread.java:595)
不能够为存储过程找到元数据!的错误信息。
开始以为调用
PreparementStatement的时候 参数设置的有问题。后来经过试验才发现是因为PreparementStatement方法调用的时候发生了错误。
具体方法如下:
开始调用的Connection接口的方法:
PreparedStatement pstmt = this.connection.prepareCall(sql.toString());
改正后调用接口的方法:
PreparedStatement pstmt = this.connection.prepareStatement(sql.toString());
总结1:
prepareCall:创建一个 CallableStatement
对象来调用数据库存储过程
prepareStatement :创建一个 PreparedStatement
对象来将参数化的 SQL 语句发送到数据库
总结2:
pstmt.setString()
可以设置所有类型的参数。不至于类型转换的时候报错。
总结3:
想了下 Mysql是不带Procedure的,不支持存储过程,所以用CallableStatement
就会报错了。但是Oracle下CallableStatement调用没有报错。
而且注意一点:CallableStatement是PrepareStatement的子接口。