[英]Find records not working Jdbc Stored Procedure
我是編寫 JDBC 存儲過程的初學者。 我成功創建了存儲過程。 如果我找到記錄,我找不到它。 我得到錯誤:
Check connectionjava.sql.SQLException: Can't set IN parameter for return value of stored function call.
我附上了到目前為止我嘗試過的代碼
public class JdbcFind {
public static void main(String[] args) {
Connection con=null;
String id,fname,lname;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost/abclibrary", "root","");
CallableStatement stat1 = con.prepareCall("{?=call authors(?,?)}");
stat1.registerOutParameter(1,Types.VARCHAR);
stat1.setString(2, "1");
stat1.registerOutParameter(3,Types.VARCHAR);
stat1.execute();
int k = stat1.getInt(1);
if(k == 0)
{
System.out.println("Customer id Not FOund");
System.exit(0);
}
System.out.println(stat1.getString(1));
System.out.println(" ");
System.out.println(stat1.getString(2));
}catch(ClassNotFoundException cle)
{
System.out.println("check your jdbc connection" );
}catch(SQLException sqe)
{
System.out.println("Check connection" +sqe);
}finally{
try{
if(con != null)
con.close();
}catch(Exception e){}
}
}
存儲過程
String str = "CREATE PROCEDURE authors (p_auth_id varchar(15), OUT p_auth_fname varchar(20), OUT p_auth_lname varchar(20))\n" +
"BEGIN\n" +
" SELECT auth_fname, auth_lname INTO p_auth_fname, p_auth_lname FROM authors where auth_id = p_auth_id;\n" +
"END;";
您的可調用語句具有三個參數(問號)。 根據JavaDoc ,您正在使用帶有結果參數的表單,這意味着您必須將其設置為 OUT 參數。
為了澄清我已經為您編號了參數:
{?=call authors(?,?)}
1 2 3
在不知道您的存儲過程的定義的情況下,我猜它需要一個 IN 參數,一個 OUT 參數並返回一個結果。 在這種情況下,您應該按如下方式設置參數:
stat1.registerOutParameter(1,Types.VARCHAR);
stat1.setString(2, "1");
stat1.registerOutParameter(3,Types.VARCHAR);
編輯:
存儲過程定義為
CREATE PROCEDURE authors (p_auth_id varchar(15), OUT p_auth_fname varchar(20), OUT p_auth_lname varchar(20))
它有三個參數(第一個在IN參數中,第二個和第三個是OUT參數)。
因此,正確的稱呼方式是:
CallableStatement stat1 = con.prepareCall("{call authors(?,?,?)}");
stat1.setString(1, "1");
stat1.registerOutParameter(2,Types.VARCHAR);
stat1.registerOutParameter(3,Types.VARCHAR);
您還必須刪除這些行:
/*
int k = stat1.getInt(1);
if(k == 0)
{
System.out.println("Customer id Not FOund");
System.exit(0);
}
*/
因為參數 1 是僅 IN 參數(並且您的存儲過程不返回除 OUT 參數之外的任何其他值)。
要從 OUT 參數讀取結果,您還必須調整參數編號:
System.out.println(stat1.getString(2));
System.out.println(" ");
System.out.println(stat1.getString(3));
不幸的是,我對存儲過程知之甚少,無法告訴您如何找出是否找到了任何行。
我可以想象,如果您的存儲過程中的查詢沒有找到任何行,那么兩個 OUT 參數都會返回null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.