存储过程无法从java代码中提供准确的结果

时间:2012-09-02 15:53:00

标签: java java-ee jdbc

我有存储过程,根据任何给定的输入搜索人员(任何生物数据,例如血型,姓名,身份号码等,接受近26个输入)。

我正在使用Callable Statement preparecall方法从java执行存储过程(sql server)。以前我遇到的问题是,只要字符串输入在其众多输入参数之一中传递,我的存储过程就不会给出任何结果(0行结果)。另一方面,当传递任何整数类型参数值但是我将jdbc驱动程序从jdbc:odbc驱动程序更改为sqlserver驱动程序时,给出了正确的结果 (driver name=com.microsoft.sqlserver.jdbc.SQLServerDrive),问题解决了。

现在我的新问题是,当我的程序procSearch2(正在运行16个输入)正在运行时,它会使Connection jdbcprocSearch1变量int变量完全正常),但是其他具有27个输入(string)的过程即使传递了 CallableStatement stmt=connect.prepareCall("{CALL procSearch1(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"); stmt.setInt(1,0); stmt.setString(2,""); stmt.setString(3,""); . . . stmt.setInt(27,0); ResultSet result=stmt.executeQuery(); if(result!=null) { System.out.println(result.getRow()); while(result.next) { System.out.println(result.getString("Name")); } } 或{{1}}输入值也没有给出任何结果。

它没有给出任何错误它只返回0行结果,它应返回3行结果。

这是代码

{{1}}

1 个答案:

答案 0 :(得分:0)

您需要将一个输出参数设置为CallableStatement以读取sp的返回值。 像这样的东西(简洁省略了异常处理):

CallableStatement  stmt = connection.prepareCall("{? = call procSearch1(?,?,?) }");
stmt.registerOutParameter(1, java.sql.Types.INTEGER);
stmt.setString(2, "abc");
stmt.setString(3, "xyz");
stmt.execute();
Integer sp_return_value = stmt.getInt(1);

编辑: 根据您的注释,如果您的SP返回Select的结果,即resultSet,我认为您需要使用statement.execute()而不是executeQuery()。

http://msdn.microsoft.com/en-us/library/ms378630.aspx& http://msdn.microsoft.com/en-us/library/ms378487.aspx

所以,你的代码应该是这样的:

CallableStatement stmt=connect.prepareCall("{CALL  procSearch1(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
stmt.setInt(1,0);
stmt.setString(2,"");
stmt.setString(3,"");
.
.
.
stmt.setInt(27,0);
ResultSet result = stmt.execute();

if(result!=null) {
    System.out.println(result.getRow()); 
    while(result.next) {
        System.out.println(result.getString("Name"));
    }
}