1 问题描述

换了一个 MySQL 数据库,原来调用正常的存储过程,现在抛错了。具体错误如下:

Caused by: java.sql.SQLException: Parameter number 2 is not an OUT parameterat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)at com.mysql.cj.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:643)at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1714)at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1722)at com.alibaba.druid.filter.FilterChainImpl.callableStatement_registerOutParameter(FilterChainImpl.java:3803)at com.alibaba.druid.filter.FilterAdapter.callableStatement_registerOutParameter(FilterAdapter.java:451)at com.alibaba.druid.filter.FilterChainImpl.callableStatement_registerOutParameter(FilterChainImpl.java:3800)at com.alibaba.druid.filter.FilterAdapter.callableStatement_registerOutParameter(FilterAdapter.java:451)at com.alibaba.druid.filter.FilterChainImpl.callableStatement_registerOutParameter(FilterChainImpl.java:3800)at com.alibaba.druid.proxy.jdbc.CallableStatementProxyImpl.registerOutParameter(CallableStatementProxyImpl.java:52)at com.alibaba.druid.pool.DruidPooledCallableStatement.registerOutParameter(DruidPooledCallableStatement.java:55)at org.apache.ibatis.executor.statement.CallableStatementHandler.registerOutputParameters(CallableStatementHandler.java:111)at org.apache.ibatis.executor.statement.CallableStatementHandler.parameterize(CallableStatementHandler.java:95)at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:88)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)at com.fsti.cc.core.ds.interceptor.SwitchDataSourceInterceptor.intercept(SwitchDataSourceInterceptor.java:189)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)at com.sun.proxy.$Proxy91.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)... 38 more

2 原因分析

因为代码没有变化,只是换了一个新数据库,所以出现问题的原因肯定在这个新的 MySQL 数据库中。
在 Navigate 中看了一下新数据库的用户账号,没有 Execute 权限:

勾选上之后,重新执行程序。抛出另一个错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with “noAccessToProcedureBodies=true” to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.

具体错误堆栈日志为:

Caused by: java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)at com.mysql.cj.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1458)at com.mysql.cj.jdbc.DatabaseMetaData.getProcedureOrFunctionColumns(DatabaseMetaData.java:3163)at com.mysql.cj.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:3032)at com.mysql.cj.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:793)at com.mysql.cj.jdbc.CallableStatement.<init>(CallableStatement.java:586)at com.mysql.cj.jdbc.CallableStatement.getInstance(CallableStatement.java:485)at com.mysql.cj.jdbc.ConnectionImpl.parseCallableStatement(ConnectionImpl.java:1516)at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1541)at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1532)at com.alibaba.druid.filter.FilterChainImpl.connection_prepareCall(FilterChainImpl.java:501)at com.alibaba.druid.wall.WallFilter.connection_prepareCall(WallFilter.java:401)at com.alibaba.druid.filter.FilterChainImpl.connection_prepareCall(FilterChainImpl.java:497)at com.alibaba.druid.filter.FilterAdapter.connection_prepareCall(FilterAdapter.java:910)at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareCall(FilterEventAdapter.java:88)at com.alibaba.druid.filter.FilterChainImpl.connection_prepareCall(FilterChainImpl.java:497)at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareCall(ConnectionProxyImpl.java:315)at com.alibaba.druid.pool.DruidPooledConnection.prepareCall(DruidPooledConnection.java:551)at org.apache.ibatis.executor.statement.CallableStatementHandler.instantiateStatement(CallableStatementHandler.java:87)at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:87)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)at com.fsti.cc.core.ds.interceptor.SwitchDataSourceInterceptor.intercept(SwitchDataSourceInterceptor.java:189)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)at com.sun.proxy.$Proxy91.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)... 38 more

提示加上 &noAccessToProcedureBodies=true

3 问题解决

在连接 URL 中加上 &noAccessToProcedureBodies=true 之后,就存储过程调用就正常了。
这种方式虽然可以解决问题,但存在一些问题,比如调用存储过程时,将没有类型检查等等 。
所以更好的解决方式是为数据库用户分配“获取存储过程元数据(MetaData)”的权限 ,具体命令为: grant Select on mysql.proc to [数据库账号]

示例为:grant Select on mysql.proc to 'cloud_user'@localhost

Parameter number 2 is not an OUT parameter 问题的解决方法相关推荐

  1. 解决JDBC中Parameter number X is not an OUT parameter

    解决JDBC中Parameter number X is not an OUT parameter 话不多数,直接上码! mysql语句如下: DELIMITER $$ CREATE PROCEDUR ...

  2. lvextend扩容后,发现还是原来的大小。报错: resize2fs: Bad magic number in super-block 打开 /dev/mapper/vg01-lv01 时的解决方法

    lvextend扩容后,发现还是原来的大小,以及报错: resize2fs: Bad magic number in super-block 打开 /dev/mapper/vg01-lv01 时的解决 ...

  3. mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...

    1. 问题背景         InnoDB是新版MySQL(v5.5及以后)默认的存储引擎,之前版本的默认引擎为MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,关于InnoD ...

  4. 误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter

    今天为了模拟一个mysql内存不释放问题,要测试一个存储过程,同时具有出参和入参,启动时报了上述错误. <select id="funcl_trd_secu_execution_que ...

  5. 解决:Parameter number 5 is not an OUT parameter

    (此处省略100000字苦逼,愚蠢的找bug过程) 错误原因有以下几个: 1.Mysql里面压根没有那个存储过程 2.Mysql里存储过程的名字跟调用的存储过程名字不一样(名字写错了) 3.存储过程代 ...

  6. java.sql.SQLException: Parameter number X is not an OUT parameter

    发生这个问题一般是以下三种情况 1.存储过程找不到,名字是否写错 2.第X个参数是否正确,或者是否是输出参数,检查存储过程定义参数,以及 call ...{?,?}中?的个数,以及java 中设置参数 ...

  7. 解决java.sql.SQLException: Parameter number X is not an OUT parameter--转

    最近独自一个人写项目,孤军奋战的程序猿可真伤不起! Java 调用MYSQL带输入输出参数存储过程时如题错误:java.sql.SQLException: Parameter number X is ...

  8. mysql报错-ERROR 1206 (HY000)- The total number of locks exceeds the lock table size-的解决方法

    mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法 问题 ...

  9. VASP出错 PZSTEIN parameter number 4 had an illegal value

    在slab优化到第三个电子步后 ,出现PZSTEIN parameter number    4 had an illegal value 的错误. 1.可能是AXIN BXIN等电荷密度相关参数的影 ...

最新文章

  1. 西北工业大学附属中学2019届高考毕业生去向,其中北大清华88人
  2. android 取消按钮禁止,android – 如何强制IntentService立即停止与取消按钮从一个活动?...
  3. 函数(一.return)
  4. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)
  5. 通过docker build --build-arg 传值进 Dockerfile 动态构建容器
  6. Behavior Designer知识点
  7. SCI论文从入门到精通(一)——如何选题
  8. java子网划分_IP地址子网划分_动力节点Java学院整理
  9. IDEA如何导入git仓库的分支代码
  10. javweb音乐网站_音乐网站javaweb源码
  11. 定义一个基类BAse,有两个公有成员函数fn1,fn2;私有派生出derived类,如何通过derived类的对象调用基类的函数fn1;
  12. js中什么是事件气泡,如何阻止事件气泡
  13. property follows cocoa naming convention for returning ‘owned‘ objects
  14. Linux(四):什么是Bash、什么是shell?
  15. 此Flash Player 与您的地区不相容,请重新安装Adobe Flash Player问题解决
  16. 中国信通院的星火链主链支持与以太链(测试网)交互
  17. 数模笔记-Excel绘图-自用
  18. 用RecyclerView实现类似支付宝应用图标拖拽排序以及增删管理的功能
  19. 计算机科学专业的五种高薪职业选择,看看你适合哪种?
  20. 多彩微立体述职报告PPT模板

热门文章

  1. 江苏省版权申请费用明细以及版权申报流程
  2. 计算机教室英语手抄报,我的教室英语手抄报
  3. Python动态网页爬虫-----动态网页真实地址破解原理
  4. 3D-GIS地理信息系统研发解决方案
  5. pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed
  6. Linux-IO全整理:BIO/NIO/IO多路复用解析
  7. 使用@Value取不到值,为null
  8. java地球承载_科普知识!几个地球能承载人类的生态足迹?
  9. 华东康桥计算机音乐,感受人文至美 华东康桥2019年第二届音乐飨宴盛大开幕
  10. Web API-添加Swagger,SQL Server,记录并导出到Excel