Ява.язык SQL.SQLException: ORA-00928: отсутствует ключевое слово SELECT. при вставке записи в БД с помощью JDBC

Я получаю ошибку, когда пытаюсь вставить некоторые строки в БД. Итак, вот код

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, дважды проверил столбцы (все они имеют одинаковое имя), вынул кавычки из имени столбца (тот же результат) без успеха. чтобы добавить его, сообщение об ошибке не очень полезная.

любые предложения будут оценены.

6 ответов


Я вижу две проблемы:

  1. нет необходимости в одинарных кавычках вокруг имен столбцов. Но вы можете заключить его в двойные кавычки. Это необходимо, если вы используете зарезервированные слова для имен столбцов или таблиц. Вот!--1-->.
  2. нужен пробел перед VALUES.

так что вам нужно изменить insertStmt В что-то вроде этого:

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

вам нужно изменить SQL заявление. (Никогда не используйте зарезервированные слова в качестве идентификаторов)

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

использовать " (двойные кавычки), чтобы избежать зарезервированных слов/ключевых слов.


печать строки insertStmt в консоли и попробуйте запустить ее непосредственно в бэкэнд. Это дает вам точную ошибку в backend. Он видит некоторый интервал или синтаксическую ошибку.


Я просто пришел на эту страницу во время поиска 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
  (?, ?, ?, ?, ?, ?, ?, ?, ?)

для других, ищущих ту же ошибку: другие синтаксические проблемы с запросом могут вызвать то же исключение. Например, опустить значения слов.


я запускал ту же проблему, и в моем случае запрос был таким:

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

проблема была вызвана number имя столбца, начиная с number - это зарезервированное ключевое слово в Oracle, и исключения вроде сообщают ORA-00928: missing SELECT keyword.

после побега number столбец, оператор был выполнен нормально:

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