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