J'ai eu l'erreur suivante en testant du code:
SQLException: index de colonne non valide
Qu'est-ce que cela veut dire exactement?
Existe-t-il un document en ligne expliquant quels sont tous les codes d'erreur et les déclarations Oracle?
S'il s'agit d'une exception SQLException levée par Java, c'est probablement parce que vous essayez d'obtenir ou de définir une valeur à partir d'un ResultSet, mais que l'index que vous utilisez n'est pas compris dans la plage.
Par exemple, vous essayez peut-être d'obtenir la colonne d'index 3 à partir du jeu de résultats, mais vous ne renvoyez que deux colonnes à partir de la requête SQL.
On dirait que vous essayez de SELECT
une colonne qui n'existe pas.
Peut-être essayez-vous de ORDER BY
une colonne qui n'existe pas?
Des fautes de frappe dans votre instruction SQL?
En utilisant SimpleJdbcTemplate de Spring, je l’ai compris quand j’ai essayé de le faire:
String sqlString = "select pwy_code from approver where university_id = '123'";
List<Map<String, Object>> rows = getSimpleJdbcTemplate().queryForList(sqlString, uniId);
J'ai eu un argument à queryForList qui ne correspondait pas à un point d'interrogation dans le code SQL. La première ligne aurait dû être:
String sqlString = "select pwy_code from approver where university_id = ?";
J'ai aussi eu cette erreur de type, le problème est l'utilisation incorrecte des paramètres à l'instruction comme, disons que vous avez une requête comme ceci
SELECT * FROM EMPLOYE E WHERE E.ID = ?
et pour l’objet prepareStatement (JDBC) si vous définissez les paramètres tels que
preparedStatement.setXXX(1,value);
preparedStatement.setXXX(2,value)
alors il en résulte SQLException: Invalid column index
Donc, j'ai enlevé ce deuxième paramètre en faisant une déclaration préparée, puis le problème a été résolu
J'ai eu exactement le même problème lors de l'utilisation de Spring Security 3.1.0. et Oracle 11G. J'utilisais la requête suivante et obtenais l'erreur d'index de colonne invalide:
<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(?)"
Il s'est avéré que je devais ajouter: "1 comme activé" à la requête:
<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(?)"
Tout a fonctionné après ça. Je pense que cela pourrait être un bogue dans le paquet principal Spring JDBC ...
J'ai eu ce problème en utilisant une déclaration préparée. Je n'ai pas ajouté assez de "?" pour les "VALEURS" Mon Eclipse s'était écrasé après avoir ajouté la quantité appropriée et perdu ces modifications. Mais cela ne m’a pas semblé être l’erreur jusqu’à ce que j’ai commencé à analyser le code SQL comme suggéré par p.campbell.
la déclaration finale de SQL est quelque chose comme:
select col_1 from table_X where col_2 = 'abcd';
je lance ceci dans mon SQL IDE et tout va bien.
Ensuite, j'essaie de construire cette déclaration avec 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
Bien que l'instruction sql (la première, exécutée sur la base de données) contienne des guillemets autour des valeurs de chaîne et se termine également par un point-virgule, la chaîne transmise à PreparedStatement ne doit pas contenir de guillemets autour du caractère générique?, Ni ne doit se terminer par demi-colonne.
je viens de supprimer les caractères qui apparaissent sur fond blanc
"select col_1 from table_X where col_2 =
'?
';";
obtenir
"select col_1 from table_X where col_2 = ?";
(J'ai trouvé la solution ici: https://coderanch.com/t/424689/databases/Java-sql-SQLException-Invalid-column )
J'ai eu ce problème dans une application héritée qui crée une instruction préparée de manière dynamique.
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());
lorsqu'il tentait de définir une valeur pour ssn, il donnait une erreur d'index de colonne non valide et finissait par découvrir qu'il était causé par firstName ayant 'inside; cela perturbe la syntaxe.