web-dev-qa-db-fra.com

java.sql.SQLException: paramètre IN ou OUT manquant à l'index :: 1

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();
22
sweet dreams

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();
25
Jim Garrison

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();
4
Frank Orellana

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();
4
Razvan

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.

1
Aaron

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 ());

0
Aaron Kurtzhals