尝试从 Java 应用程序运行以下查询时,我从 Oracle 数据库收到 ORA-00904 错误:
String sql =
"insert into LOADER_COUNT_STATUS (facility, count, author, run, created, ended, seconds) \n" +
"values(?,?,?,?,?,?,?)";
PreparedStatement ps = null;
ps = db.getPreparedStatement(sql);
ps.setString(1, facility);
ps.setInt(2, count);
ps.setString(3, author);
ps.setLong(4, run);
ps.setDate(5, new java.sql.Date(startClock.getTime()));
ps.setDate(6, new java.sql.Date(Calendar.getInstance().getTime().getTime()));
ps.setLong(7, ((Calendar.getInstance().getTime().getTime() - startClock.getTime()) / 1000));
int rowCountUpdated = ps.executeUpdate();
getPreparedStatement()
只是 java.sql.connection.prepareStatement()
的薄包装,所有其他方法都直接来自 java.sql
这是 LOADER_COUNT_STATUS 的 DDL:
CREATE TABLE SPEC.LOADER_COUNT_STATUS
(
ID NUMBER GENERATED ALWAYS AS IDENTITY ( START WITH 8461 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER NOKEEP) NOT NULL,
FACILITY VARCHAR2(64 BYTE),
COUNT NUMBER,
CREATED DATE DEFAULT sysdate,
AUTHOR VARCHAR2(16 BYTE),
"COMMENT" VARCHAR2(64 BYTE),
RUN NUMBER(38),
ENDED DATE DEFAULT sysdate,
SECONDS NUMBER(38)
)
如何消除这个特定错误?我不认为这是区分大小写的问题,因为只有当 DDL 中的列名用双引号括起来时才会弹出这些错误。
Seconds
是Oracle中的关键字,需要使用双引号来转义"
然而,双引号是Java中的特殊字符,因此您也需要使用\"
对其进行转义。
所以,你应该这样做:
String sql = "insert into LOADER_COUNT_STATUS (facility, count, author, run, created, ended, \"seconds\") \n" +
"values(?,?,?,?,?,?,?)";
祝你好运
您的表是
SPEC.LOADER_COUNT_STATUS
(即 LOADER_COUNT_STATUS
模式拥有的 SPEC
表。
您没有展示如何将 Java 程序连接到 Oracle 数据库,但是:
insert into LOADER_COUNT_STATUS (facility, count, author, run, created, ended, seconds)
values(?,?,?,?,?,?,?)
将尝试插入到您连接的用户拥有的架构中的
LOADER_COUNT_STATUS
表中。如果您没有连接到 SPEC
用户,那么它将尝试使用本地模式中具有相同名称的表(或通过别名);这可能不会是同一个表,也可能不会有相同的列。
相反,请使用:
insert into SPEC.LOADER_COUNT_STATUS (facility, count, author, run, created, ended, seconds)
values(?,?,?,?,?,?,?)