いくつかのJava 1.6-Oracle11g-JDBC(OJDBC 6を使用)コード(以下)を作成しました。例外が発生しています-Java.sql.SQLException: Missing IN or OUT parameter at index:: 1
なぜこれが起こっているのですか、どうすれば修正できますか?
私の出力は
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
コードは
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);}
}
}
編集-コードを修正するために、
//最初の行を挿入
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();
// 2行目を挿入
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();
これはSQLの仕組みではありません:
_INSERT INTO employee(hans,germany) values(?,?)
_
値_(hans,germany)
_は、列名_(emp_name, emp_address)
_を使用する必要があります。値は、Statement.setString(pos,value)
メソッドを使用してプログラムによって提供されます。 2つのパラメーター(疑問符)があると言ったが、値を提供しなかったため、不満を言っています。
PreparedStatementを作成してから、次のようにパラメーター値を設定する必要があります。
_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();
_
列名を使用してから、挿入する値を設定する必要があります(両方とも?マーク)。
//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();
最初の問題は、クエリ文字列が間違っていることです。
私はこれを考える:"INSERT INTO employee(hans,germany) values(?,?)"
は次のようになります:"INSERT INTO employee(name,country) values(?,?)"
もう1つの問題は、パラメーター化されたPreparedStatementがあり、実行する前にパラメーターを設定しないことです。
これらをコードに追加する必要があります。
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();
INSERTステートメントで:
INSERT INTO employee(hans,germany) values(?,?)
フィールド名が属する場所に値があります。次のように変更します。
INSERT INTO employee(emp_name,emp_address) values(?,?)
SQLプロンプトからそのステートメントを実行すると、次のようになります。
INSERT INTO employee(emp_name,emp_address) values('hans','germany');
String/varchar値を単一引用符で囲む必要があることに注意してください。
また、準備済みステートメントにパラメーターを追加することもありません。それが実際にあなたが見ているエラーの原因です。これを試して:
PreparedStatement ps = con.prepareStatement(inserting);
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.execute();
また( Oracle に従って)、任意のSQLステートメントに対して「実行」を使用できます。 「executeUpdate」を使用することもこの状況で有効であり、影響を受ける行の数を示す整数を返します。
PreparedStatementの使用方法については、以下のリンクを参照してください。リンクからも引用しています。
http://docs.Oracle.com/javase/tutorial/jdbc/basics/prepared.html
PreparedStatementオブジェクトを実行する前に、疑問符プレースホルダー(存在する場合)の代わりに値を指定する必要があります。これを行うには、PreparedStatementクラスで定義されているセッターメソッドの1つを呼び出します。次のステートメントは、updateSalesというPreparedStatementの2つの疑問符プレースホルダーを提供します。
updateSales.setInt(1、e.getValue()。intValue()); updateSales.setString(2、e.getKey());