Java.SQL.SQLException: paramètre manquant dans ou hors de l'index:: 1

J'ai fait quelques Java 1.6-Oracle11g-JDBC (en utilisant le code OJDBC 6) (ci-dessous). J'obtiens 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 ?

Mon résultat 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);}


    }

}

modifier - Pour corriger le code, nous utilisons-

//insertion de 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();

//insertion de 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();
20
demandé sur maxx777 0000-00-00 00:00:00

5 réponses

Ce n'est pas la façon dont SQL fonctionne:

INSERT INTO employee(hans,germany) values(?,?)

valeurs (hans,germany) doit utiliser les noms de colonne (emp_name, emp_address). Les valeurs sont fournies par votre programme en utilisant le Statement.setString(pos,value) méthodes. Elle se plaint parce que vous avez dit qu'il y avait deux paramètres (les points d'interrogation) mais n'avez pas fourni de valeurs.

vous devez créer un État de préparation et ensuite définir les valeurs des paramètres comme dans:

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();
24
répondu Jim Garrison 2017-09-14 07:17:55

vous devez utiliser les noms de colonne et ensuite définir les valeurs à insérer (les deux ? les 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();
3
répondu Frank Orellana 2012-08-08 19:28:52

le premier problème est que votre chaîne de requête est erronée:

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 Préprogrammation paramétré et que vous ne définissez pas les paramètres avant de l'exécuter.

Vous devez l'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();
3
répondu Razvan 2017-09-14 07:17:10

Dans votre INSERT:

INSERT INTO employee(hans,germany) values(?,?)

vous avez vos valeurs à la place de vos noms de champs. Changer:

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 mettre des guillemets simples autour des valeurs string/varchar.

de plus, vous n'ajoutez aucun paramètre à votre déclaration préparée. C'est ce qui cause l'erreur que vous voyez. Essayez ceci:

PreparedStatement ps = con.prepareStatement(inserting); 
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.execute();

Aussi (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 pour indiquer le nombre de lignes affectées.

1
répondu Aaron 2012-08-08 19:53:07

Voir le lien ci-dessous pour plus d'informations sur la façon d'utiliser PreparedStatement. J'ai également cité à partir du lien.

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

vous devez fournir des valeurs à la place des espaces réservés aux points d'interrogation (si there are any) avant que vous puissiez exécuter un objet PreparedStatement. Faire en communiquant avec l'une des méthodes de définition définis dans le PreparedStatement de classe. Les déclarations suivantes fournissent les deux points d'interrogation dans la déclaration préparée et intitulée updateSales:

updateSales.setInt(1, E. getValue ().intValue()); updateSales.sangle de serrage(2, e. getKey ());

0
répondu Aaron Kurtzhals 2012-08-08 19:29:39