2014-11-21 101 views
1

試圖執行使用JDBC存儲過程,我似乎無法讓過去這個錯誤,參數1號是不是OUT參數

java.sql.SQLException: Parameter number 1 is not an OUT parameter

public static void SP1() throws SQLException, IOException { 

    try { 

     stmt = conn.createStatement(); 
     stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp1;"); 

     stmt.executeUpdate("CREATE PROCEDURE sp1(OUT cName VARCHAR(20))" 
       + "SELECT CuratorName FROM curator " 
       + "WHERE CuratorPhone = \"90394857\" INTO cName;"); 

     conn.commit(); 

     System.out.println("Sp1 created"); 

     CallableStatement cs3 = conn.prepareCall("{call sp1(?)}"); 
     cs3.registerOutParameter(1, java.sql.Types.VARCHAR); 
     cs3.execute(); 
     String result = cs3.getString("cName"); 
     System.out.println("Result from sp1:" + result); 

    } catch (Exception e) { 

     System.out.println(e); 
    } 

} 
+0

該雜質是否獨立運行(即在Java之外)? – 2014-11-21 14:06:24

+0

你正在使用哪些DBMS? – 2014-11-21 14:07:58

+0

我正在使用本地主機上運行的Mysql。我在Netbeans IDE中運行所有東西 – TonyQuig 2014-11-21 14:10:40

回答

-2

如果你的存儲過程定義包含一個IN參數看你有共同的代碼,然後Call語句應該是這樣的

CallableStatement cs3 = conn.prepareCall("{call sp1(?)}"); 
    cs3.setString(1, java.sql.Types.VARCHAR); 

的參數需要被設置爲IN參數。

如果您的存儲過程定義包含一個OUT參數,那麼您的調用語句需要修改。

CallableStatement cs3 = conn.prepareCall("{? = call sp1()}"); 
     cs3.registerOutParameter(1, java.sql.Types.VARCHAR); 

在任何情況下,分享你的程序的定義,這將使它更清晰。

+0

我試過你的第二個選項,因爲我有一個輸出參數。我現在得到這個錯誤:java.lang.NullPointerException – TonyQuig 2014-11-21 14:18:46

+2

'cs3.setString(1,java.sql.Types.VARCHAR);'當你將一個整數賦給一個字符串參數時會出現語法錯誤。你會爲它分配一個字符串值。因爲這個問題是關於'OUT'的,所以作爲你答案的一部分是沒有意義的。其次,'{? =調用sp1()}對於存儲過程,使用單個**返回**值而不是'OUT'參數進行轉義。 – 2014-11-21 16:07:36