Подтвердить что ты не робот

Java.sql.SQLException: Отсутствует параметр IN или OUT в индексе:: 1

Я сделал код 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();
4b9b3361

Ответ 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');

Обратите внимание, что вам нужно будет поместить одинарные кавычки вокруг значений string/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. Делать это путем вызова одного из методов setter, определенных в Класс PreparedStatement. Следующие утверждения предоставляют два заполнители вопросительных знаков в PreparedStatement с именем updateSales:

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