java.sql.SQLException:索引处缺少 IN 或 OUT 参数:: 1
Posted
技术标签:
【中文标题】java.sql.SQLException:索引处缺少 IN 或 OUT 参数:: 1【英文标题】:java.sql.SQLException: Missing IN or OUT parameter at index:: 1 【发布时间】:2012-08-05 23:41:08 【问题描述】:我制作了一些 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();
【问题讨论】:
不应该是INSERT INTO employee(emp_name, emp_address) ...然后设置参数吗? 【参考方案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】:您必须使用列名,然后设置要插入的值(两个 ? 标记):
//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();
【讨论】:
【参考方案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】:在您的 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”也是有效的,它会返回一个整数来指示受影响的行数。
【讨论】:
【参考方案5】:有关如何使用 PreparedStatement 的信息,请参阅下面的链接。我也引用了链接。
http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
您必须提供值来代替问号占位符(如果 有任何),然后才能执行 PreparedStatement 对象。做 这通过调用定义在 PreparedStatement 类。以下语句提供了两个 PreparedStatement 中名为 updateSales 的问号占位符:
updateSales.setInt(1, e.getValue().intValue()); updateSales.setString(2, e.getKey());
【讨论】:
以上是关于java.sql.SQLException:索引处缺少 IN 或 OUT 参数:: 1的主要内容,如果未能解决你的问题,请参考以下文章
线程“主”java.sql.SQLException 中的异常:索引处缺少 IN 或 OUT 参数:: 25 这个错误是啥意思
java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭
java.sql.SQLException:参数索引超出范围(4 > 参数个数,即 3)
java.sql.SQLException:参数索引超出范围(2 > 参数个数,即 0)
java.sql.SQLException: [Microsoft][ODBC Driver Manager] 无效的描述符索引
java.sql.SQLException:[Microsoft][ODBC Driver Manager] 无效的描述符索引