2012-08-08 13 views
19

Ho creato codice Java 1.6-Oracle11g-JDBC (utilizzando OJDBC 6) (di seguito). Ricevo un'eccezione - java.sql.SQLException: Missing IN or OUT parameter at index:: 1 Perché sta succedendo questo problema e come lo risolvo?java.sql.SQLException: parametro IN o OUT mancante all'indice :: 1

La mia uscita è-

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 

Il codice è-

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 - Per correggere il codice, abbiamo uso-

// inserire prima fila

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

// inserire 2 ° fila

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

Non dovrebbe essere INSERIRE nel dipendente (emp_name, emp_address) ... e quindi impostare i parametri? – markus

risposta

23

Questo non è come funziona SQL:

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

I valori (hans,germany) dovrebbero usare i nomi delle colonne (emp_name, emp_address). I valori sono forniti dal programma utilizzando i metodi Statement.setString(pos,value). Si lamenta perché hai detto che c'erano due parametri (i punti interrogativi) ma non forniva valori.

Si dovrebbe essere la creazione di un PreparedStatement e quindi impostando i valori dei parametri come in:

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

È necessario utilizzare i nomi delle colonne e quindi impostare i valori da inserire (entrambi i marchi?):

//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

Il primo problema è che la stringa di query è sbagliata:

penso che questo: "INSERT INTO employee(hans,germany) values(?,?)" dovrebbe essere simile a questo: "INSERT INTO employee(name,country) values(?,?)"

L'altro problema è che si dispone di un parametro PreparedStatement e non si impostano i parametri prima di eseguirlo.

Si dovrebbe aggiungere questi per il tuo codice:

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

vedi il link qui sotto per informazioni su come utilizzare PreparedStatement. Ho anche citato dal link.

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

è necessario fornire valori al posto dei segnaposto punto interrogativo (se ce ne sono) prima di poter eseguire un oggetto PreparedStatement. Fare chiamando uno dei metodi setter definiti nella classe PreparedStatement . Le seguenti istruzioni forniscono i due segnaposto del punto interrogativo nel PreparedStatement denominato updateSales:

updateSales.setInt (1, e.getValue(). IntValue()); updateSales.setString (2, e.getKey());

1

Nelle tue istruzioni INSERT:

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

Tu hai i valori in cui i nomi dei campi appartengono. Cambiarlo in essere:

INSERT INTO employee(emp_name,emp_address) values(?,?) 

Se si dovesse eseguire questa affermazione da un prompt SQL, sarebbe simile a questa:

INSERT INTO employee(emp_name,emp_address) values('hans','germany'); 

Nota che avresti bisogno di mettere le virgolette singole attorno alla stringa/valori varchar.

Inoltre, non si aggiungono parametri alla dichiarazione preparata. Questo è ciò che sta effettivamente causando l'errore che stai vedendo. Prova questo:

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

anche (secondo Oracle), è possibile utilizzare "eseguire" per qualsiasi istruzione SQL. Anche l'utilizzo di "executeUpdate" sarebbe valido in questa situazione, che restituirebbe un intero per indicare il numero di righe interessate.

Problemi correlati