在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的子接口。
分享到:
相关推荐
然而,随着技术的发展,攻击者找到了无需引号就能构造有效SQL语句的方法,使得攻击变得更加容易。 PHP与MySQL结合的环境中,SQL注入的误区在于人们通常认为必须使用单引号来构造SQL语句。实际上,无论在哪种编程...
例如,在登录页面中,如果使用 Statement 来执行 SQL 语句,可能会出现 SQL 注入的问题: ```java String sql = "select * from users " + "where username = ' " + username + " ' and password= ' " + passwd + ...
3. SonarQube:代码质量管理工具,可检测潜在的安全问题和代码质量缺陷。 通过综合运用这些技术和工具,可以显著降低SQL注入的风险,保护您的Web应用程序和数据库免受攻击。对于开发者来说,理解和实施这些防御策略...
7. JavaScript连接js文件的方法中,src属性应指向js文件,如`<script language="javascript" src="a.js"></script>`。 8. `<body>`是双标签,而不是单标签。 9. 用户点击提交后,客户端通过浏览器(如IE)访问服务器...
JDBC接口中没有`Preparement`,应为`PreparedStatement`。 7. **JSP执行过程**:JSP先被翻译成Java源码,然后编译为字节码,最后执行生成网页,对应顺序是翻译-》编译-》执行。 8. **JSP表达式**:`...