解决java.sql.SQLException:索引中丢失 IN或OUT 参数::x问题

 更新时间:2023年12月13日 16:46:29   作者:bisal(Chen Liu)  
这篇文章主要介绍了解决java.sql.SQLException:索引中丢失 IN或OUT 参数::x问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java.sql.SQLException:索引中丢失 IN或OUT 参数::x

使用JDBC时,会有这么一个错误:java.sql.SQLException: 索引中丢失 IN或OUT 参数::x

如下:

示例中insertLog.execute();这行会抛出这个异常:

String logSQL = "insert into tbl_obj(id, obj, type, cont, proposer, operator, date, remark) "
                       + "values(seq_tot.nextval, ?, ?, ?, ?, ?, SYSDATE, ?)";
insertLog = conn.prepareStatement(logSQL);
insertLog.setString(2, trace.getObj());
insertLog.setString(3, trace.getType());
insertLog.setString(4, trace.getCont());
insertLog.setString(5, trace.getProposer());
insertLog.setString(6, trace.getOperator());
insertLog.setString(8, trace.getRemark());
insertLog.execute();

检索了一些帖子,对于这种问题,指出的原因很多

  • 全角半角引起;
  • 参数过多;
  • 配置文件和数据库字段类型不一致;
  • 或是数据库的索引问题等”

根据错误提示,归结为两点

(1) 索引是否有问题?(“索引中丢失”)

(2) 字段赋值是否与数据库字段类型匹配?

  • 对于(1)的论证:

查看这张表的索引,这张表是以ID作为主键,没有其他索引,因此只有一个主键索引,查看状态也是VALID的,没有错误:

SQL> select index_name, status from user_indexes where table_name='TBL_OBJ_TRACE';
 
INDEX_NAME                     STATUS
------------------------------ --------
SYS_C0031302                   VALID
  • 对于(2)的论证:

首先看了trace的set/get方法中对字段类型的定义,都是String,对应库中的字段类型都是VARCHAR2,没有差别。

其次再看setString,和VALUES中字段是对应的啊。

其实问题就出在这了,看下setString方法的解释:

void java.sql.PreparedStatement.setString(int parameterIndex, String x) throws SQLException
 
Sets the designated parameter to the given Java String value. The driver converts this to an SQL VARCHAR or LONGVARCHAR value (depending on the argument's size relative to the driver's limits on VARCHAR values) when it sends it to the database.
 
Parameters:
parameterIndex the first parameter is 1, the second is 2, ...
x the parameter value
Throws:
SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement

可以看到第一个参数parameterIndex,参数索引,parameterIndex does not correspond to a parameter marker in the SQL statement(如果没有对应到SQL语句中的参数标识符),则会抛出SQLException异常。

SQL语句中values(seq_tot.nextval, ?, ?, ?, ?, ?, SYSDATE, ?)的参数标识符一共6个,setString同样是6个,但顺序不对,setString中第一个参数的索引序号是要和SQL语句中是一致的,并不是SQL语句中这里VALUES字段的位置,而应该是SQL语句VALUES中参数标识符的序号。

改为如下格式就对了:

String logSQL = "insert into tbl_obj(id, obj, type, cont, proposer, operator, date, remark) "
                       + "values(seq_tot.nextval, ?, ?, ?, ?, ?, SYSDATE, ?)";
insertLog = conn.prepareStatement(logSQL);
insertLog.setString(1, trace.getObj());
insertLog.setString(2, trace.getType());
insertLog.setString(3, trace.getCont());
insertLog.setString(4, trace.getProposer());
insertLog.setString(5, trace.getOperator());
insertLog.setString(6, trace.getRemark());
insertLog.execute();

总结

JDBC的这个报错,提示信息很晦涩,但这个错误感觉是属于那种碰过一次之后,基本下次就能知道错误的范围,排查起来应该也比较顺畅了。

例如:

索引是否有问题、代码中的字段类型和表中字段类型是否一致、代码中使用的参数索引和SQL语句中的参数标识符是否一致(个数、顺序等)。

好了,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java观察者模式的深入了解

    Java观察者模式的深入了解

    这篇文章主要为大家介绍了Java观察者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Redis之GEO存储地理位置信息的使用

    Redis之GEO存储地理位置信息的使用

    在外卖软件中的附近的美食店铺、外卖小哥的距离,打车软件附近的车辆,交友软件中附近的小姐姐。我们都可以利用redis的GEO地理位置计算得出。本文就来详细的介绍一下
    2021-10-10
  • java调用webservice的.asmx接口的使用步骤

    java调用webservice的.asmx接口的使用步骤

    这篇文章主要介绍了java调用webservice的.asmx接口的使用步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • JDK(免安装)各种版本下载及配置详细图文教程

    JDK(免安装)各种版本下载及配置详细图文教程

    这篇文章主要给大家介绍了关于JDK(免安装)各种版本下载及配置的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-07-07
  • Java中包的概念和用法实战案例分析

    Java中包的概念和用法实战案例分析

    这篇文章主要介绍了Java中包的概念和用法,结合具体案例形式分析了java包的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java面试题冲刺第十四天--PRC框架

    Java面试题冲刺第十四天--PRC框架

    这篇文章主要为大家分享了最有价值的三道关于PRC框架的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 如何调用chatGPT实现代码机器人

    如何调用chatGPT实现代码机器人

    最近chatGPT也是非常的火爆,相信大家都看到了,现在提供一种Java调用chatGPT的方法,我们主要通过两个工具来实现,一就是httpclient,二就是hutool,你觉得那种好理解你就用那种即可,今天通过本文给大家分享调用chatGPT实现代码机器人,感兴趣的朋友一起看看吧
    2022-12-12
  • 编译大型Java项目class冲突导致报错的解决方案

    编译大型Java项目class冲突导致报错的解决方案

    这篇文章给大家盘点编译大型项目class冲突导致报错的解决方案,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • 如何使用SpringMVC的消息转换器设置日期格式

    如何使用SpringMVC的消息转换器设置日期格式

    这篇文章主要介绍了如何使用SpringMVC的消息转换器设置日期格式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java接口性能优化技巧

    java接口性能优化技巧

    这篇文章主要为大家介绍了java接口性能优化技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论