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


    }

}

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

//插入第一行

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

5 回答 5

32

这不是 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();
于 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(?,?)"

另一个问题是您有一个参数化的 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 语句使用“执行”。在这种情况下使用“executeUpdate”也是有效的,它将返回一个整数来指示受影响的行数。

于 2012-08-08T19:33:11.580 回答
0

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

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

在执行 PreparedStatement 对象之前,您必须提供值来代替问号占位符(如果有)。通过调用 PreparedStatement 类中定义的 setter 方法之一来执行此操作。以下语句在名为 updateSales 的 PreparedStatement 中提供两个问号占位符:

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

于 2012-08-08T19:29:39.780 回答