【问题标题】:java.sql.SQLException: ORA-00928: missing SELECT keyword. when inserting record to DB using JDBCjava.sql.SQLException: ORA-00928: 缺少 SELECT 关键字。使用 JDBC 将记录插入数据库时
【发布时间】:2011-11-25 04:07:58
【问题描述】:

当我尝试将一些行插入数据库时​​出现错误。所以这里是代码

try {
    String insertStmt = "INSERT into " +
                        "MY_TABLE('RECORD_TYPE', 'FILE_TYPE', 'DATE', 'BATCH_NO', 'RECORD_COUNT')" +
                        "VALUES(?, ?, ?, ?, ?);";

    PreparedStatement pstmt = super.con.prepareStatement(insertStmt);

    pstmt.setString(1, input[0]);
    pstmt.setString(2, input[1]);
    pstmt.setString(3, input[2]);
    pstmt.setString(4, input[3]);
    pstmt.setString(5, input[4]);

    System.out.println("Insert rows : " + pstmt.executeUpdate());

} catch (SQLException sqle) {
    System.out.println(sqle.getMessage());
    sqle.printStackTrace();
} catch (Exception e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
} finally {
    con.close();
}

并且数据库上的所有内容都是 varchar 类型,仔细检查了列(它们都是相同的名称),从列名中取出引号(相同的结果)没有成功。把它加起来,错误信息不是很有帮助。

任何建议将不胜感激。

【问题讨论】:

  • 尝试不带引号(如果有的话应该是双引号),不带尾随分号,并在values之前加一个空格。
  • RECORD_COUNT) 和 VALUES(.. 之间没有空格,因此您的插入命令看起来像 'INSERT into MY_TABLE(......)VALUES(????)`
  • 我认为你总是需要使用双引号,因为 DATE 通常是一个无效的标识符。 (这就是为什么您不应该将其用作列名的原因。另外,为什么将其存储为字符串?)
  • values 之前实际上不需要空格,尽管那样通常看起来更好。
  • 去掉查询的右双引号前的分号。

标签: java oracle jdbc ora-00928


【解决方案1】:

您需要更改SQL 语句。 (切勿使用保留字作为标识符)

String insertStmt = "INSERT into \"MY_TABLE\" (RECORD_TYPE,FILE_TYPE, 
              \"DATE\",BATCH_NO,RECORD_COUNT) VALUES (?, ?, ?, ?, ?)";

使用"(双引号)转义保留字/关键字。

【讨论】:

  • 嘿伙计,我正要在这里回答这个问题。是的,日期列需要用双引号括起来,然后转义。感谢您的回答:D:D:D
【解决方案2】:

我可以发现两个问题:

  1. 不需要在列名周围加上单引号。但是你可以用双引号括起来。如果您对列名或表名使用保留关键字,则必须这样做。这里DATE
  2. VALUES 之前需要一个空格。

所以你需要把insertStmt 改成这样:

String insertStmt = "INSERT into " +
    "MY_TABLE(RECORD_TYPE, FILE_TYPE, \"DATE\", BATCH_NO, RECORD_COUNT) " +
    "VALUES(?, ?, ?, ?, ?);";

【讨论】:

  • 阅读 OP 和标题 - 这完全是关于 oracle
【解决方案3】:

在控制台中打印 insertStmt 字符串并尝试在后端直接触发它。它会在后端为您提供确切的错误。它发现一些空格或语法错误。

【讨论】:

  • 是的,我尝试从 db ide 插入一条记录,并且知道存在一些语法错误。感谢您的回答 jwalin。欣赏它
【解决方案4】:

我刚刚在搜索 ORA-00928 时来到此页面,我想指出我的问题是列列表开头的额外逗号:

INSERT INTO redacted.redacted
  (
  , redacted_id   -- The comma at the start of this line will trigger ORA-00928.
  , another_redacted_id
  , redacted1
  , redacted2
  , redacted3
  , created_at
  , created_by
  , changed_at
  , changed_by
  )
  VALUES
  (?, ?, ?, ?, ?, ?, ?, ?, ?)

【讨论】:

    【解决方案5】:

    对于搜索相同错误的其他人:查询的其他语法问题可能会导致引发相同的异常。例如,省略单词 VALUES。

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,就我而言,查询是这样的:

      insert into Address (number, street, id) values (?, ?, ?)
      

      这个问题是由number 列名引起的,因为number 是Oracle 中的保留关键字,并且异常有点误导ORA-00928: missing SELECT keyword

      转义number列后,语句正常执行:

      insert into Address ("number", street, id) values (?, ?, ?)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 2018-09-17
        • 2018-05-13
        • 1970-01-01
        • 2019-08-17
        • 2013-01-21
        • 1970-01-01
        相关资源
        最近更新 更多