2011-05-11 5 views
26

ho ottenuto il seguente errore durante la verifica del codice:Cosa significa il seguente errore medio di Oracle: indice di colonna non valida

SQLException: Invalid column index

Che cosa vuol dire?

Esiste un documento online che spiega quali sono tutti i codici di errore e le dichiarazioni Oracle?

+5

Puoi modificare la tua domanda per includere l'istruzione SQL esatto che questo errore ha gettato su? Forse includono i dettagli esatti dell'errore, insieme al numero ORA? –

+0

Messaggi di errore Oracle: http://download.oracle.com/docs/cd/E11882_01/server.112/e17766/toc.htm –

risposta

35

Se si tratta di una SQLException lanciata da Java, è molto probabile perché si sta tentando di ottenere o impostare un valore da un ResultSet, ma l'indice che si sta utilizzando non è compreso nell'intervallo.

Ad esempio, è possibile che si stia tentando di ottenere la colonna all'indice 3 dal set di risultati, ma sono state restituite solo due colonne dalla query SQL.

8

Sembra che tu stia provando a SELECT una colonna che non esiste.

Forse stai provando a ORDER BY una colonna che non esiste?

Qualsiasi errore di ortografia nell'istruzione SQL?

5

Utilizzando SimpleJdbcTemplate di primavera, ho capito quando ho cercato di fare questo:

String sqlString = "select pwy_code from approver where university_id = '123'"; 
List<Map<String, Object>> rows = getSimpleJdbcTemplate().queryForList(sqlString, uniId); 
  • Ho litigato per queryForList che non corrispondeva ad un punto interrogativo in SQL. La prima riga avrebbe dovuto essere:

    String sqlString = "select pwy_code from approver where university_id = ?"; 
    
2

ho avuto lo stesso problema quando si utilizza Primavera di sicurezza 3.1.0. e Oracle 11G. Stavo usando la seguente query e ottenere la valida errore di indice di colonna:

<security:jdbc-user-service data-source-ref="dataSource" 
       users-by-username-query="SELECT A.user_name AS username, A.password AS password FROM MB_REG_USER A where A.user_name=lower(?)" 

Si scopre che avevo bisogno di aggiungere: "1 come permesso" alla query:

<security:jdbc-user-service data-source-ref="dataSource" users-by-username query="SELECT A.user_name AS username, A.password AS password, 1 as enabled FROM MB_REG_USER A where A.user_name=lower(?)" 

Tutto ha funzionato dopo che . Credo che questo potrebbe essere un bug nel pacchetto core JDBC di primavera ...

1

Ho avuto questo problema utilizzando una dichiarazione preparata. Non ho aggiunto abbastanza "?" per i "VALORI" La mia eclissi si è schiantata dopo che ho aggiunto la quantità giusta e ho perso quelle modifiche. Ma questo non mi è sembrato l'errore fino a quando non ho iniziato a lavorare su SQL come suggerito da p.campbell.

2

Ho anche avuto questo tipo di errore, il problema è l'uso sbagliato di parametri dichiarazione del genere, diciamo che si dispone di una query come questa

SELECT * FROM EMPLOYE E WHERE E.ID = ? 

e per l'oggetto PreparedStatement (JDBC) se si imposta i parametri come

preparedStatement.setXXX(1,value); 
preparedStatement.setXXX(2,value) 

poi si traduce in SQLException: Invalid column index

Così, ho rimosso quel secondo l'impostazione dei parametri di dichiarazione preparata allora il problema risolto

0

Ho riscontrato questo problema in un'applicazione legacy che crea istruzioni preparate dinamicamente.

String firstName; 
StringBuilder query =new StringBuilder("select id, name from employee where country_Code=1"); 
query.append("and name like '"); 
query.append(firstName + "' "); 
query.append("and ssn=?"); 
PreparedStatement preparedStatement =new prepareStatement(query.toString()); 

quando si tenta di impostare il valore per lo SSN, stava dando non valida errore indice di colonna, e, infine, scoperto che essa è causata da firstName avendo 'all'interno; questo disturba la sintassi.

-1

devo tabella Oracle con sottostante struttura

SQL> desc demo 
Name          Null? Type 
----------------------------------------- -------- ------------ 

ID             NUMBER(38) 
NAME            VARCHAR2(20) 
SALARY            NUMBER(6) 
**************************** 

stavo cercando di inserire i valori con il sottostante codice e ottenuto l'errore

**************************** 
PreparedStatement stmt=con.prepareStatement("update demo set salary=? where id=?"); 
stmt.setInt(3,288800); 
stmt.setInt(1,8); 


************************ 

SQLException: indice di colonna non valido

codice corretto è

************************ 
PreparedStatement stmt=con.prepareStatement("update demo set salary=? where id=?"); 
stmt.setInt(1,288800); 
stmt.setInt(2,8); 
******************* 
stmt.setInt(1,288800);//1 represents salary i.e first '?' 
stmt.setInt(2,8);//2 represents id i.e second '?' 

Qui 1 rappresenta in realtà non colonna nella query prepareStatement non colonna non in tabella del database

Spero che questo aiuti ..

[1]: https://i.stack.imgur.com/vXvMA.png 
0

l'istruzione SQL finale è qualcosa di simile:

select col_1 from table_X where col_2 = 'abcd'; 

corro questo dentro il mio IDE SQL e tutto è ok.

Avanti, cerco di costruire questa dichiarazione con java:

String queryString= "select col_1 from table_X where col_2 = '?';"; 
PreparedStatement stmt = con.prepareStatement(queryString); 
stmt.setString(1, "abcd"); //raises java.sql.SQLException: Invalid column index 

Anche se l'istruzione SQL (il primo, corse contro il database) contiene le virgolette attorno valori di stringa, e finisce anche con una semicolonna, il la stringa che ho passato a PreparedStatement non dovrebbe contenere virgolette attorno al carattere jolly?, né dovrebbe terminare con una semicolonna.

ho appena rimosso i caratteri che appaiono su sfondo bianco

"select col_1 from table_X where col_2 ='?';";

per ottenere

"select col_1 from table_X where col_2 = ?"; 

(ho trovato qui la soluzione: https://coderanch.com/t/424689/databases/java-sql-SQLException-Invalid-column)

Problemi correlati