有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JDBCJava。sql。SQLException:索引::1处缺少IN或OUT参数

我编写了一些Java1.6-Oracle11g-JDBC(使用OJDBC6)代码(如下)。我得到一个异常-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();

//插入第二行

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

共 (5) 个答案

  1. # 1 楼答案

    SQL不是这样工作的:

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

    (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();
    
  2. # 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');
    

    请注意,您需要在string/varchar值周围加上单引号

    此外,您也没有在准备好的语句中添加任何参数。这就是你看到的错误的真正原因。试试这个:

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

    此外(根据Oracle),您可以对任何SQL语句使用“execute”。在这种情况下,使用“executeUpdate”也是有效的,它将返回一个整数来指示受影响的行数

  3. # 3 楼答案

    第一个问题是您的查询字符串错误:

    我认为:"INSERT INTO employee(hans,germany) values(?,?)"应该是这样:"INSERT INTO employee(name,country) values(?,?)"

    另一个问题是,您有一个参数化的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();
    
  4. # 4 楼答案

    有关如何使用PreparedStatement的信息,请参见下面的链接。我还引用了链接

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

    You must supply values in place of the question mark placeholders (if there are any) before you can execute a PreparedStatement object. Do this by calling one of the setter methods defined in the PreparedStatement class. The following statements supply the two question mark placeholders in the PreparedStatement named updateSales:

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

  5. # 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();