相信大家在做JDBC 的 PrepareStatement后台开发中,用?号作为占位符时,对于PrepareStatement抛出的错误的真正原因可能是不好查找的,比如今天我就遇到了一个问题:
Exception Stack:
java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 35
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.driver.OracleStatement.checkBindsInAndOut(OracleStatement.java:1968)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2809)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
......
如可能如下情况会抛出以上错误:
code:
......
/**
*ID :员工编号 数据库中是NUMBER类型
*NAME : 员工姓名 数据库中是VARCHAR2类型
*HIREDATE : 入职时间 数据库中是 DATE类型
*DEPT:部门编号 数据库中是VARCHAR2类型
*GRADE:职位 数据库中是VARCHAR2类型
*/
String sql = "INSERT INTO EMP (ID,NAME,HIREDATE,DEPT,GRADE) VALUES(?,?,sysdate,?,?);";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setBigDecimal(1,123);
ps.setString(2,"张三");
ps.setString(4,"25");
ps.setString(5,"3");
......
以上错误的原因是:sysdate 位置没有占位符号“?”但是你在用PreparedStatement SET 参数的时候把这个位置算进去了,那么就会抛出:
java.sql.SQLException: 索引中丢失 IN 或 OUT 参数 错误
PreparedStatement.setXXX(
INDEX,VALUE),中的
INDEX是连续的123......,假如你SQL中有
sysdate
这样的值或者表达式,那么在PreparedStatement设置值时它的位置是不能算的。
以上正确的形式应该是:
String sql = "INSERT INTO EMP (ID,NAME,HIREDATE,DEPT,GRADE) VALUES(?,?,sysdate,?,?);";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setBigDecimal(1,123);
ps.setString(2,"张三");
ps.setString(3,"25");//DEPT占位符位置应该是3而不是4
ps.setString(4,"3");//GRADE占位符位置应该是4不是5
......
分享到:
相关推荐
在Java编程中,`java.sql.SQLException: 结果集已耗尽` 是一个常见的错误提示,通常出现在处理数据库查询结果集时。这个异常表明程序试图访问已经没有数据的结果集中下一行,即所有行已经被遍历完,尝试访问超出范围...
java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK ……
标题中的“Caused by: java.sql.SQLException: JZ0SJ: 没有在此数据库中发现元数据存取器信息。 请按 jConnect 文档中所述安装”是一个典型的错误信息,表明在尝试使用Java数据库连接(JDBC)驱动程序访问数据库时...
在oracle里面运行一下,解决Exception java.sql.SQLException ORA-00600 内部错误代码
### 服务器出现java.sql.SQLException No suitable driver found for 的解析与解决方案 #### 问题背景 在进行Servlet开发过程中,尤其是在尝试连接数据库时,遇到了一个常见的异常:“java.sql.SQLException: No ...
在Oracle数据库操作中,我们经常会遇到与`java.sql.SQLException`相关的异常。这个异常通常是Java应用程序在尝试与Oracle数据库进行交互时出现的问题。本篇将详细探讨`java.sql.SQLException`的各种常见类型及其解决...
3. **执行SQL**:创建Statement或PreparedStatement对象,编写SQL语句,并调用executeQuery()或executeUpdate()方法。 4. **处理结果集**:对于查询语句,使用ResultSet对象获取查询结果,遍历每一行数据。 5. **...
java.sql.SQLException: null, message from server: “Host ‘223.72.41.7’ is not allowed to connect to this MySQL server” 客户端访问时报错: 解决方法: 1,登陆服务器 mysql> use mysql; //用mysql ...
Q: I am working with ... I am using updateBinaryStream method of resultset to update the BLOB field but it is failing after giving following exception java.sql.SQLException: Internal Error: Unable to
主要给大家介绍了关于MySQL存储表情时报错:java.sql.SQLException: Incorrect string value: 'xF0x9Fx92xA9x0Dx0A...'的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
本文主要介绍了关于MySQL存储表情报错:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\xA9\x0D\x0A…’的相关解决方法,分享出供大家参考学习,下面话不多说了,来一起看看详细的介绍: ...
在Java编程中,数据库连接是应用开发不可或缺的一部分。在MySQL 5.6版本中,我们需要一个合适的驱动来建立与数据库的连接。当你遇到"java.sql.SQLException: No suitable driver"这样的错误时,通常意味着你的Java...
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 提示的是用户访问被拒绝,原因是密码不正确,但是我们明明配置的是正确的密码,原因就在yml中: spring: datasource: ...
Unknown column 'fillMen' in 'field list' java.sql.SQLException: Operation not ...java.sql.SQLException: QueryRunner requires a DataSource to be invoked in this way, or a Connection should be passed in
import java.sql.SQLException; ``` 3. **注册驱动**:在使用MySQL驱动前,需要通过`Class.forName()`方法注册驱动。尽管在较新的JDBC版本中这个步骤可以省略,但为了兼容性,很多示例代码仍然包含它: ```java ...
当你尝试连接到MySQL数据库时,可能会遇到一个特定的异常:“java.sql.SQLException: The server time zone value ‘?й???????’ is unrecognized or represents more than one time zone”。这个错误表明服务器...
绝对好用的9i驱动包+10g驱动包 解决java.sql.SQLException: 不支持的特性 解决oracle.jdbc.driver.OracleDatabaseMetaData.supportsGetGeneratedKeys()Z异常 等等
它由Sun Microsystems开发并被纳入Java SE(标准版)的一部分,允许开发者在Java应用程序中执行SQL语句,实现数据的增删改查。JDBC驱动是连接Java应用程序和数据库之间的桥梁,不同的数据库需要对应的JDBC驱动。 1....
请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlClient.SqlException: 无法打开登录所请求的数据库 “TakeClass”。登录失败。 用户 ‘2D2727E2578F446\...
外键约束有几种不同的行为设置,这在SQL中通常通过`ON DELETE`子句来指定: 1. **RESTRICT(或NO ACTION)**:这是默认的行为,当尝试删除父表中的记录时,如果这个记录在子表中有对应的外键引用,数据库将阻止删除...