2012-09-02 47 views
0

我有存储过程,根据任何给定的输入(任何生物数据,例如血型,名称,身份证号等等,需要近26个输入)来搜索人员。存储过程没有给出java代码的准确结果

我正在执行一个存储过程(SQL服务器)从Java使用Callable Statementpreparecall方法。以前我有一个问题,即当字符串输入在其许多输入参数之一中传递时,我的存储过程没有给出任何结果(0行结果)。另一方面,当通过任何整数类型参数值时,但当我将jdbc驱动程序从jdbc:odbc驱动程序更改为sqlserver驱动程序 (driver name=com.microsoft.sqlserver.jdbc.SQLServerDrive)时,问题得到了解决。

现在我的新问题是,当我的程序procSearch2,即以16个输入,运行它给出的结果与jdbc驱动程序(改变一个)的相同Connection变量完全正常,但其他程序,其中有27个输入(procSearch1)即使通过intstring输入值也未给出任何结果。

它不会给出任何错误,它只是返回我0行结果,它应该返回3行结果。

这里是代码

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

你试过从后端执行第二个过程,看它是否返回任何数据? – user75ponic

+0

是的,我调试每一行,并检查我的procSearch2给出结果,但procSearch1 doesnot。它根据sp在sql server中运行的时间返回空行,它应该返回3行。 –

回答

0

您需要设置输出paramater到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返回一个选择,即一个结果的结果,我认为你需要使用的语句。 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")); 
    } 
} 
+0

sp有5个返回的输出值(一个表的5列)一些字符串和一些整数值。为此,我不得不添加1个输出参数?在调用proc语法之前,即“{?= call procSearch1(?,?,?,?)}”。而且我所讨论的另一个过程即使不使用registerOutParameter()或定义输出参数,也可以给出非常好的结果。 –

+0

我did ** ResultSet结果= stmt.execute(); **但它给了我相同的结果0行结果时,我打印** System.out.println(result.getRow()); **内部结果!=空块。另外m执行语句后打印stmt.getUpdateCount(),它给了我** - 1 **结果 –