Oracle 在运行简单插入语句时抛出“ORA-00904:“SECONDS”:无效标识符”,但表中存在秒列

问题描述 投票:0回答:2

尝试从 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 中的列名用双引号括起来时才会弹出这些错误。

java oracle
2个回答
0
投票

Seconds
是Oracle中的关键字,需要使用双引号来转义
"
然而,双引号是Java中的特殊字符,因此您也需要使用
\"
对其进行转义。 所以,你应该这样做:

String sql = "insert into LOADER_COUNT_STATUS (facility, count, author, run, created, ended, \"seconds\") \n" +
          "values(?,?,?,?,?,?,?)";

祝你好运


0
投票

您的表是

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(?,?,?,?,?,?,?)
© www.soinside.com 2019 - 2024. All rights reserved.