J'ai créé du code Java 1.6-Oracle11g-JDBC (en utilisant OJDBC 6) (ci-dessous). Je reçois une exception - Java.sql.SQLException: Missing IN or OUT parameter at index:: 1
Pourquoi cela se produit-il et comment puis-je le réparer?
Ma sortie est-
create CREATE TABLE employee(emp_name varchar(25),emp_address varchar(25))
insert INSERT INTO employee(jim,germany) values(?,?)
Exception: Java.sql.SQLException: Missing IN or OUT parameter at index:: 1
Le code est-
import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.PreparedStatement;
import Java.sql.SQLException;
import Java.sql.Statement;
public class Oracle {
public static void main(String[]args)
{
try
{
Connection con = DriverManager.getConnection("jdbc:Oracle:thin:@//localhost:1521/xe", "newman", "123456");
Statement stmt = con.createStatement();
String create = "CREATE TABLE employee(emp_name varchar(25),emp_address varchar(25))";
System.out.println("create " + create);//
stmt.execute(create);
//insert 1st row
String inserting = "INSERT INTO employee(hans,germany) values(?,?)";
System.out.println("insert " + inserting);//
PreparedStatement ps = con.prepareStatement(inserting);
ps.executeUpdate();
//insert 2nd row
inserting = "INSERT INTO employee(david,austria) values(?,?)";
System.out.println("insert " + inserting);//
ps = con.prepareStatement(inserting);
ps.executeUpdate();
}catch(SQLException ex){System.out.println("Exception: " + ex);}
}
}
EDIT - Pour corriger le code, nous utilisons-
// insère la 1ère ligne
String inserting = "INSERT INTO
employee(emp_name,emp_address) values(?,?)";
PreparedStatement ps = con.prepareStatement(inserting);
System.out.println("insert " + inserting);//
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.executeUpdate();
// insère la 2e rangée
inserting = "INSERT INTO
employee(emp_name,emp_address) values(?,?)";
ps = con.prepareStatement(inserting);
System.out.println("insert " + inserting);//
ps.setString(1, "david");
ps.setString(2, "austria");
ps.executeUpdate();
Ce n'est pas comme ça que SQL fonctionne:
INSERT INTO employee(hans,germany) values(?,?)
Les valeurs (hans,germany)
doivent utiliser les noms de colonne (emp_name, emp_address)
. Les valeurs sont fournies par votre programme en utilisant les méthodes Statement.setString(pos,value)
. Il se plaint parce que vous avez dit qu'il y avait deux paramètres (les points d'interrogation) mais que vous n'avez pas fourni de valeurs.
Vous devriez créer un PreparedStatement, puis définir les valeurs des paramètres comme suit:
String insert= "INSERT INTO employee(emp_name,emp_address) values(?,?)";
PreparedStatement stmt = con.prepareStatement(insert);
stmt.setString(1,"hans");
stmt.setString(2,"germany");
stmt.execute();
Vous devez utiliser les noms de colonne, puis définir les valeurs à insérer (les deux marques?):
//insert 1st row
String inserting = "INSERT INTO employee(emp_name ,emp_address) values(?,?)";
System.out.println("insert " + inserting);//
PreparedStatement ps = con.prepareStatement(inserting);
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.executeUpdate();
Le premier problème est que votre chaîne de requête est incorrecte:
Je pense que ceci: "INSERT INTO employee(hans,germany) values(?,?)"
devrait être comme ceci: "INSERT INTO employee(name,country) values(?,?)"
L'autre problème est que vous avez un PreparedStatement paramétré et que vous ne définissez pas les paramètres avant de l'exécuter.
Vous devriez les ajouter à votre code:
String inserting = "INSERT INTO employee(name,country) values(?,?)";
System.out.println("insert " + inserting);//
PreparedStatement ps = con.prepareStatement(inserting);
ps.setString(1,"hans"); // <----- this
ps.setString(2,"germany");// <---- and this
ps.executeUpdate();
Dans vos déclarations INSERT:
INSERT INTO employee(hans,germany) values(?,?)
Vous avez vos valeurs où vos noms de champs appartiennent. Changez-le pour être:
INSERT INTO employee(emp_name,emp_address) values(?,?)
Si vous deviez exécuter cette instruction à partir d'une invite SQL, elle ressemblerait à ceci:
INSERT INTO employee(emp_name,emp_address) values('hans','germany');
Notez que vous devez placer des guillemets simples autour des valeurs string/varchar.
En outre, vous n’ajoutez aucun paramètre à votre instruction préparée. C'est ce qui cause réellement l'erreur que vous voyez. Essaye ça:
PreparedStatement ps = con.prepareStatement(inserting);
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.execute();
De même (selon Oracle ), vous pouvez utiliser "execute" pour n’importe quelle instruction SQL. L'utilisation de "executeUpdate" serait également valide dans cette situation, ce qui renverrait un entier indiquant le nombre de lignes affectées.
Consultez le lien ci-dessous pour savoir comment utiliser PreparedStatement. J'ai également cité le lien.
http://docs.Oracle.com/javase/tutorial/jdbc/basics/prepared.html
Avant de pouvoir exécuter un objet PreparedStatement, vous devez fournir des valeurs à la place des espaces réservés avec un point d'interrogation (le cas échéant ). Faire ceci en appelant l’une des méthodes de définition définies dans le fichier Classe PreparedStatement. Les déclarations suivantes fournissent les deux Espaces réservés aux points d'interrogation dans le PreparedStatement nommé updateSales:
updateSales.setInt (1, e.getValue (). intValue ()); updateSales.setString (2, e.getKey ());