java.sql.SQLException:索引:: 1处缺少IN或OUT参数

swe*_*ams 24 java jdbc oracle11g

我制作了一些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
Run Code Online (Sandbox Code Playgroud)

代码是 -

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


    }

}
Run Code Online (Sandbox Code Playgroud)

编辑 - 为了纠正代码,我们使用 -

//插入第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();
Run Code Online (Sandbox Code Playgroud)

//插入第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();
Run Code Online (Sandbox Code Playgroud)

Jim*_*son 25

这不是SQL的工作原理:

INSERT INTO employee(hans,germany) values(?,?)
Run Code Online (Sandbox Code Playgroud)

(hans,germany)应使用列名称(emp_name, emp_address).这些值由程序使用Statement.setString(pos,value)方法提供.它抱怨是因为你说有两个参数(问号)但没有提供值.

您应该创建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();
Run Code Online (Sandbox Code Playgroud)


Fra*_*ana 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();
Run Code Online (Sandbox Code Playgroud)