java.sql.SQLException: ORA-00928: отсутствует ключевое слово SELECT.при вставке записи в БД с использованием JDBC - PullRequest
8 голосов
/ 25 ноября 2011

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

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 ]

5 голосов
/ 25 ноября 2011

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

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

Используйте " (двойные кавычки) для экранирования зарезервированных слов / ключевых слов.

4 голосов
/ 25 ноября 2011

Я могу заметить две проблемы:

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

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

String insertStmt = "INSERT into " +
    "MY_TABLE(RECORD_TYPE, FILE_TYPE, \"DATE\", BATCH_NO, RECORD_COUNT) " +
    "VALUES(?, ?, ?, ?, ?);";
2 голосов
/ 25 ноября 2011

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

1 голос
/ 02 октября 2012

Я только что зашел на эту страницу во время поиска 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
  (?, ?, ?, ?, ?, ?, ?, ?, ?)
0 голосов
/ 27 апреля 2016

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

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

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

После выхода из столбца number оператор выполнялся нормально:

insert into Address ("number", street, id) values (?, ?, ?)
0 голосов
/ 06 февраля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...