2011-11-25 673 views
8

me sale un error cuando intento insertar algunas filas en un db. así que aquí está el códigojava.sql.SQLException: ORA-00928: palabra clave SELECT que falta. cuando inserto el registro a DB usando 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(); 
} 

y todo en el DB es de tipo VARCHAR, comprobó el doble de las columnas (todos son del mismo nombre), se llevó a cabo la cita fuera el nombre de columna (mismo resultado) sin éxito. para agregarlo, el mensaje de error no es muy útil.

cualquier sugerencia sería apreciada.

+3

Try sin las comillas (debe estar entre comillas si lo hay), sin el punto y coma final, y con un espacio antes de 'values'. – Thilo

+4

No hay espacio entre RECORD_COUNT) y VALUES (... por lo que su comando de inserción se ve como 'INSERTAR en MY_TABLE (......) VALUES (????) ' – Kal

+3

Creo que siempre tendrá que usar el doble comillas, ya que DATE es normalmente un identificador inválido. (Por eso no debe usarlo como un nombre de columna. Y además, ¿por qué está almacenado como una cadena?) –

Respuesta

3

que pueden detectar dos problemas:

  1. No hay necesidad de comillas simples nombres de columna. Pero puedes envolverlo entre comillas dobles. Es necesario si usa palabras clave reservadas para nombres de columnas o tablas. Aquí DATE.
  2. Necesita un espacio antes de VALUES.

Así que hay que cambiar insertStmt a algo como esto:

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

Lea el PO y el título - Se trata de ** oráculo **. – adatapost

+0

@AVD Editado la respuesta, y gracias por señalar que – Jomoos

2

Imprimir insertStmt Cadena en la consola e intente dispararla directamente en el back-end. Te da un error exacto en el back-end. Detecta algún espaciado o error de sintaxis.

+1

sí, intenté insertar un registro de la base de datos y sabía que había algunos errores de sintaxis. gracias por la respuesta jwalin. lo aprecio –

+0

Bienvenido en cualquier momento simon .. –

4

Debe cambiar la declaración SQL. (No utilice palabras reservadas como identificadores)

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

Uso " (comillas dobles) para escapar de las palabras reservadas/palabras clave.

+0

hey man, estaba a punto de responder eso aquí. Sí, la columna de fecha debe estar rodeada por comillas dobles y luego escapada. gracias por la respuesta: D: D: D –

1

Me acaba de llegar a esta página durante la búsqueda de ORA-00928, y me gustaría tener en cuenta que mi problema era un extra coma al comienzo de la lista de columnas:

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

para otros que buscan el mismo error: Otras cuestiones sintácticas con la consulta puede causar la misma excepción que se lance. Por ejemplo, omitir la palabra VALORES.

0

estaba corriendo el mismo problema, y ​​en mi caso la consulta era la siguiente:

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

El problema fue causado por el nombre number columna desde number es una palabra clave reservada en Oracle, y la excepción era tipo de engañosa ORA-00928: missing SELECT keyword.

Después de escapar de la columna de la number, la declaración fue ejecutado normalmente:

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