繁体   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