Preparement方法问题

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就会报错了。但是OracleCallableStatement调用没有报错。

而且注意一点:CallableStatementPrepareStatement的子接口。

 

 

你可能感兴趣的:(oracle,sql,数据库,mysql,存储)