2012-08-08 347 views
19

我製作了一些Java 1.6-Oracle11g-JDBC(使用OJDBC 6)代碼(如下)。我收到一個例外 - java.sql.SQLException: Missing IN or OUT parameter at index:: 1 爲什麼會發生這種情況,我該如何解決?java.sql.SQLException:在index :: 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(); 
+1

不應該是INSERT INTO employee(emp_name,emp_address)...然後設置參數? – markus 2012-08-08 19:31:21

回答

23

這不是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(); 
3

必須使用列名,然後設置要插入的值(包括引號):

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

1

在你的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」也是有效的,它會返回一個整數來指示受影響的行數。

相關問題