簡體   English   中英

java.sql.SQLException:索引處缺少 IN 或 OUT 參數:: 1

[英]java.sql.SQLException: Missing IN or OUT parameter at index:: 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();

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

您必須使用列名,然后設置要插入的值(兩個 ? 標記):

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

第一個問題是你的查詢字符串是錯誤的:

我認為: "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();

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

有關如何使用 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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM