簡體   English   中英

查找記錄不起作用 Jdbc 存儲過程

[英]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.

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