2012-08-08 293 views
19

Hice un código Java 1.6-Oracle11g-JDBC (utilizando OJDBC 6) (a continuación). Recibo una excepción: java.sql.SQLException: Missing IN or OUT parameter at index:: 1 ¿Por qué sucede esto y cómo lo soluciono?java.sql.SQLException: Falta el parámetro IN o OUT en el índice :: 1

Mi salida iS-

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 

El código es-

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


    } 

} 

EDITAR - Para corregir el código, que uso-

// Introducir primera 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(); 

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

¿No debería ser INSERT INTO employee (emp_name, emp_address) ... y luego establecer los parámetros? – markus

Respuesta

23

Esto no es cómo funciona SQL:

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

Los valores (hans,germany) deben utilizar nombres de columna (emp_name, emp_address). Los valores son provistos por su programa usando los métodos Statement.setString(pos,value). Se queja porque dijo que había dos parámetros (los signos de interrogación) pero no proporcionó valores.

Usted debe crear un PreparedStatement y luego establecer los valores de parámetros como en:

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

Debe utilizar los nombres de columna y luego establecer los valores para insertar (ambas marcas?):

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

El primer problema es que su cadena de consulta está mal:

creo que esto: "INSERT INTO employee(hans,germany) values(?,?)" debería ser así: "INSERT INTO employee(name,country) values(?,?)"

El otro problema es que tiene un PreparedStatement parametrizado y no establece los parámetros antes de ejecutarlo.

Debe añadir estos a su código:

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

consulte el siguiente enlace para obtener información sobre cómo utilizar PreparedStatement. También he citado del enlace.

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

debe proporcionar valores en lugar de los marcadores de posición signo de interrogación (si hay) antes de poder ejecutar un objeto PreparedStatement. Realice llamando a uno de los métodos setter definidos en la clase PreparedStatement. Las siguientes instrucciones proporcionan los dos marcadores de posición de signo de interrogación en PreparedStatement denominado updateSales:

updateSales.setInt (1, e.getValue(). IntValue()); updateSales.setString (2, e.obtener la clave());

1

En sus declaraciones INSERT:

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

Usted tiene sus valores, donde los nombres de los campos pertenecen. Cambiarlo a ser:

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

Si se va a ejecutar esa declaración de un indicador de SQL, se vería así:

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

Tenga en cuenta que lo que se necesita para poner comillas simples alrededor de la cadena/valores varchar.

Además, tampoco está agregando ningún parámetro a su declaración preparada. Eso es lo que realmente está causando el error que estás viendo. Prueba esto:

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

también (según Oracle), puede utilizar "ejecutar" para cualquier instrucción SQL. Usar "executeUpdate" también sería válido en esta situación, que devolvería un número entero para indicar el número de filas afectadas.

Cuestiones relacionadas