wake-up-neo.com

java.sql.SQLException: Fehlender IN- oder OUT-Parameter bei index :: 1

Ich habe Java 1.6-Oracle11g-JDBC-Code (mit OJDBC 6) (unten) erstellt. Ich erhalte eine Ausnahme - Java.sql.SQLException: Missing IN or OUT parameter at index:: 1 Warum geschieht dies und wie kann ich es beheben?

Meine Ausgabe ist-

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

Der Code ist-

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 - Um den Code zu korrigieren, verwenden wir-

// erste Zeile einfügen 

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

// zweite Zeile einfügen 

        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

So funktioniert SQL nicht:

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

Die Werte (hans,germany) sollten Spaltennamen (emp_name, emp_address) verwenden. Die Werte werden von Ihrem Programm mithilfe der Statement.setString(pos,value)-Methoden bereitgestellt. Es beschwert sich, weil Sie sagten, es gäbe zwei Parameter (die Fragezeichen), aber keine Werte.

Sie sollten ein PreparedStatement erstellen und dann Parameterwerte wie folgt einstellen:

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

Sie müssen die Spaltennamen verwenden und dann die Werte zum Einfügen (beide Markierungen) festlegen:

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

Das erste Problem ist, dass Ihre Abfragezeichenfolge falsch ist: 

Ich denke das: "INSERT INTO employee(hans,germany) values(?,?)" sollte so sein: "INSERT INTO employee(name,country) values(?,?)"

Das andere Problem ist, dass Sie ein parametrisiertes PreparedStatement haben und die Parameter nicht vor der Ausführung festlegen. 

Sie sollten diese zu Ihrem Code hinzufügen: 

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

In Ihren INSERT-Anweisungen:

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

Sie haben Ihre Werte dort, wo Ihre Feldnamen gehören. Ändern Sie es so:

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

Wenn Sie diese Anweisung von einer SQL-Eingabeaufforderung aus ausführen würden, würde sie folgendermaßen aussehen:

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

Beachten Sie, dass Sie die String/varchar-Werte in einfache Anführungszeichen setzen müssen.

Außerdem fügen Sie Ihrer vorbereiteten Anweisung auch keine Parameter hinzu. Das ist, was tatsächlich den Fehler verursacht, den Sie sehen. Versuche dies:

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

Außerdem (gemäß Oracle ) können Sie "Ausführen" für jede SQL-Anweisung verwenden. Die Verwendung von "executeUpdate" wäre auch in dieser Situation gültig, wodurch eine ganze Zahl zurückgegeben wird, um die Anzahl der betroffenen Zeilen anzugeben.

1
Aaron

Informationen zur Verwendung von PreparedStatement finden Sie unter dem folgenden Link. Ich habe auch aus dem Link zitiert.

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

Sie müssen Werte anstelle der Platzhalter für Fragezeichen (falls vorhanden.) Angeben, bevor Sie ein PreparedStatement-Objekt ausführen können. Tun Dazu rufen Sie eine der Setter-Methoden auf, die in der .__ definiert sind. PreparedStatement-Klasse Die folgenden Anweisungen liefern die beiden Platzhalter für Fragezeichen in PreparedStatement mit dem Namen updateSales:

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

0
Aaron Kurtzhals