Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:索引::1处缺少IN或OUT参数_Java_Jdbc_Oracle11g - Fatal编程技术网

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

java.sql.SQLException:索引::1处缺少IN或OUT参数,java,jdbc,oracle11g,Java,Jdbc,Oracle11g,我编写了一些Java1.6-Oracle11g-JDBC(使用OJDBC6)代码(如下)。我得到一个异常-java.sql.SQLException:索引::1处缺少IN或OUT参数 为什么会发生这种情况,我该如何解决 我的输出是- create CREATE TABLE employee(emp_name varchar(25),emp_address varchar(25)) insert INSERT INTO employee(jim,germany) values(?,?) Excep

我编写了一些Java1.6-Oracle11g-JDBC(使用OJDBC6)代码(如下)。我得到一个异常-
java.sql.SQLException:索引::1处缺少IN或OUT参数
为什么会发生这种情况,我该如何解决

我的输出是-

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

SQL不是这样工作的:

INSERT INTO employee(hans,germany) values(?,?)
(德国汉斯)
应使用列名
(emp\u名称,emp\u地址)
。这些值由程序使用
语句.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();

必须使用列名,然后设置要插入的值(两个?标记):


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

我认为:
“插入员工(汉斯,德国)价值观(?)”
应该是这样:
“插入员工(姓名,国家)价值观(?)”

另一个问题是您有一个参数化的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();
String inserting=“插入员工(姓名、国家)值(?,)”;
系统输出打印项次(“插入”+插入)//
准备好的报表ps=合同准备好的报表(插入);

ps.setString(1,“hans”);// 有关如何使用PreparedStatement的信息,请参见下面的链接。我还引用了链接

必须提供值来代替问号占位符(如果需要) 在可以执行PreparedStatement对象之前,存在任何错误。做 这可以通过调用 PreparedStatement类。下面的语句提供了这两种方法 名为updateSales的PreparedStatement中的问号占位符:

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


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

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

是否应该将其插入员工(emp\U名称、emp\U地址)。。。然后设置参数?
PreparedStatement ps = con.prepareStatement(inserting); 
ps.setString(1, "hans");
ps.setString(2, "germany");
ps.execute();