【发布时间】:2016-07-04 13:52:55
【问题描述】:
我有以下疑问:
SELECT MAX(ID) FROM INGRESO_SALIDA_BUQUES WHERE ID_BUQUE = 1;
当我在 SQLDeveloper 中执行它时有效。它只返回一行一列:ID_BUQUE = 1 的最大 ID。
现在,我正在使用 jdbc 连接到数据库并执行相同的操作。代码如下:
String sql = "SELECT MAX(ID) AS MAXIMO FROM INGRESO_SALIDA_BUQUES ";
sql += "WHERE ID_BUQUE = " + registroSalida.getIdBuque();
PreparedStatement prepStmt = conn.prepareStatement(sql);
recursos.add(prepStmt);
ResultSet rs = prepStmt.executeQuery();
las 代码行是引发错误的代码行。
来自 Eclipse 控制台的结果(供您参考“Nombre de columna no válido”表示无效的列名):
18:40:27,712 ERROR [stderr] (default task-2) SQLException:Nombre de columna no válido
18:40:27,712 ERROR [stderr] (default task-2) java.sql.SQLException: Nombre de columna no válido
18:40:27,713 ERROR [stderr] (default task-2) at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3724)
18:40:27,713 ERROR [stderr] (default task-2) at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2799)
18:40:27,713 ERROR [stderr] (default task-2) at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:498)
我尝试删除除 1 之外的所有行,以查看如果 我将 MAX(ID) 更改为 ID 会发生什么情况。此查询有效。我只用一行再次尝试了 MAX(ID),但又失败了。
该表是使用以下代码创建的:
CREATE TABLE INGRESO_SALIDA_BUQUES (
ID NUMBER,
ID_BUQUE NUMBER NOT NULL,
FECHA_INGRESO DATE NOT NULL,
FECHA_SALIDA DATE,
CONSTRAINT PK_ISB PRIMARY KEY (ID),
CONSTRAINT FK_ISB_ID_BUQUE FOREIGN KEY (ID_BUQUE) REFERENCES BUQUE(ID));
你知道怎么解决吗?
recursos 只是一个 ArrayList:
private ArrayList<Object> recursos;
然后在构造函数中初始化它。 recursos = new ArrayList();
我用它来保存SQL语句所需的资源,以便以后关闭它们。
关闭它们的方法是这样的:
public void cerrarRecursos() {
for(Object ob : recursos){
if(ob instanceof PreparedStatement)
try {
((PreparedStatement) ob).close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
【问题讨论】:
-
代码中的哪一行引发了错误?什么是
recursos(此处不包含定义)?这可能不是您的错误的根源,但您确实应该在查询中使用绑定变量,并且使用id作为每个表中的键名通常不是一个好主意。 -
@JustinCave 我编辑了这个问题。关于绑定变量的使用,我会学习并使用,看起来很有用,谢谢。知道,我需要这个东西来工作。我稍后会更改密钥的名称。
-
registroSalida.getIdBuque()最有可能返回一个 alpha 值,例如“blah”。然后您的查询被转换为SELECT MAX(ID) FROM INGRESO_SALIDA_BUQUES WHERE ID_BUQUE = blah;,并且数据库引擎认为您正在将ID_BUQUE与表中的另一列blah进行比较 -
@cha 不,不是这样,它返回一个 Int。
-
从堆栈跟踪中,
invalid column name错误来自getString()调用,而不是execute()。所以它不在您显示的代码中。当您处理结果集时,您是否按名称查找列 - 因为变体有效,您是否在做getString("ID")?如果是这样,您要么需要getString("MAXIMO"),要么将查询中的别名从 MAXIMO 更改为 ID。
标签: java sql jdbc oracle11g oracle-sqldeveloper