java.sql.SQLException:ORA-00928:缺少SELECT关键字。使用JDBC将记录插入DB时

时间:2011-11-25 04:07:58

标签: java oracle jdbc ora-00928

当我尝试向db插入一些行时出现错误。所以这是代码

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();
}

并且db上的所有内容都是varchar类型,双重检查列(它们都是相同的名称),从列名中取出引号(相同的结果)没有成功。要添加它,错误消息不是很有帮助。

任何建议都将受到赞赏。

6 个答案:

答案 0 :(得分:5)

您需要更改SQL声明。 (绝不使用保留字作为标识符)

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

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

答案 1 :(得分:4)

我可以发现两个问题:

  1. 列名称周围不需要单引号。但你可以用双引号括起来。如果要对列名或表名使用保留关键字,则必须执行此操作。这里DATE
  2. VALUES之前需要一个空格。
  3. 所以你需要将insertStmt改为这样的事情:

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

答案 2 :(得分:2)

在Console中打印insertStmt String并尝试在直接后端触发它。它会在后端为您提供准确的错误。它会产生一些间距或语法错误。

答案 3 :(得分:1)

我在搜索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
  (?, ?, ?, ?, ?, ?, ?, ?, ?)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我正在运行相同的问题,在我的情况下,查询是这样的:

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

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

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

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