jdbc查询数据库报:java.sql.SQLException: ORA-01006: 绑定变量不存在

错误信息如下:
java.sql.SQLException: ORA-01006: 绑定变量不存在
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1451)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:651)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2117)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2331)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:422)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:366)

代码如下:
/**
* 按条件查询
* @param um
* @return
*/
public ArrayList getUserByCondithion(UserModel um){
ArrayList list = new ArrayList();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = JdbcConn.getConn();
String sql = "select uuid,name,age from tbl_user where 1=1";
pstmt = conn.prepareStatement(sql);
sql = getSql(sql, um);
setSqlValue(pstmt,um);
rs = pstmt.executeQuery();
list = this.rs2Model(rs);
return list;
}catch(Exception err){
err.printStackTrace();
}finally{
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}

/**
* 按条件查询sql
* @param sql
* @param um
* @return
*/
private String getSql(String sql, UserModel um){
if(um.getUuid() != null && um.getUuid().length() > 0){
sql += " and uuid=? ";
}
if(um.getName() != null && um.getName().length() > 0){
sql += " and name=? ";
}
if(um.getAge() != null && um.getAge().length() > 0){
sql += " and age=? ";
}
return sql;
}

/**
* 设置sql位置
* @param pstmt
* @param um
* @throws SQLException
* @throws SQLException
*/
private void setSqlValue(PreparedStatement pstmt,UserModel um) throws SQLException{
int i = 1;
if(um.getUuid() != null && um.getUuid().trim().length() > 0){
pstmt.setString(i, um.getUuid());
i++;
}
if(um.getName() != null && um.getName().trim().length() > 0){
pstmt.setString(i, um.getName());
i++;
}
if(um.getAge() != null && um.getAge().trim().length() > 0){
pstmt.setString(i, um.getAge());
i++;
}

}

查询总报“绑定变量不存在”,我的建表语句是:
-- Create table
create table TBL_USER
(
UUID VARCHAR2(10),
NAME VARCHAR2(10),
AGE VARCHAR2(20)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
next 1
minextents 1
maxextents unlimited
);

请高手看看这个错是什么原因造成的,非常感谢!

胡乱猜测一下。

int i = 1;
if(um.getUuid() != null && um.getUuid().trim().length() > 0){
pstmt.setString(i, um.getUuid());
i++;
}

java中所有这种类似数组的东西,都应该是从0开始,而不是从1开始。
所以 int i = 0;追问

这是java连接数据库,数据库的列索引是从1开始的,所以这里设为1,除此之外还有没有别的原因?我怎么都没看出来是哪儿错,可是就是老报错,谢谢!

追答

“数据库的列索引是从1开始的”,这个结论是哪儿来的?

你按照我说的试了吗 ? 试试看!

追问

试了,报错“无效的列索引”,我用jdbc连接数据库pstmt.setString(1,um.getUuid()),都是从1开始的,增删改查都可以,就是这个按条件查询老报“绑定变量不存在”,个人见解,请指教。
PS:我找到原因了,是
pstmt = conn.prepareStatement(sql);
sql = getSql(sql, um);
这两行代码的位置反了,应该是
sql = getSql(sql, um);
pstmt = conn.prepareStatement(sql);
我还是对概念理解不深,谢谢您的回答!

温馨提示:答案为网友推荐,仅供参考
大家正在搜