29

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


    }

}

編集-コードを修正するには、次を使用します-

//1行目を挿入

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

5 に答える 5

32

これは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();
于 2012-08-08T19:27:57.817 に答える
5

列名を使用してから、挿入する値を設定する必要があります(両方の?マーク)。

//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();
于 2012-08-08T19:28:52.577 に答える
4

最初の問題は、クエリ文字列が間違っていることです。

私はこれを考えます:"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();
于 2012-08-08T19:28:57.663 に答える
2

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

文字列/varchar値を一重引用符で囲む必要があることに注意してください。

さらに、プリペアドステートメントにパラメータを追加していません。それが実際にあなたが見ているエラーを引き起こしているものです。これを試して:

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

また(Oracleによると)、任意のSQLステートメントに「execute」を使用できます。この状況では、「executeUpdate」の使用も有効であり、影響を受ける行数を示す整数が返されます。

于 2012-08-08T19:33:11.580 に答える
0

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

于 2012-08-08T19:29:39.780 に答える