Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储过程不能从java代码中给出准确的结果_Java_Jakarta Ee_Jdbc - Fatal编程技术网

存储过程不能从java代码中给出准确的结果

存储过程不能从java代码中给出准确的结果,java,jakarta-ee,jdbc,Java,Jakarta Ee,Jdbc,我有一个存储过程,可以根据任何给定的输入(任何生物数据,例如血型、姓名、身份证号等)搜索人员,几乎需要26个输入 我正在使用Callable语句preparecall方法从java执行一个存储过程(sql server)。以前,我遇到了一个问题,即每当字符串输入传入它的多个输入参数中的一个时,存储过程都不会给出任何结果(0行结果)。另一方面,当传递任何整型参数值时,但当我将jdbcdriver从jdbc:odbcdriver更改为sqlserverdriver时,给出了正确的结果 (driver

我有一个存储过程,可以根据任何给定的输入(任何生物数据,例如血型、姓名、身份证号等)搜索人员,几乎需要26个输入

我正在使用
Callable语句
preparecall
方法从java执行一个存储过程(sql server)。以前,我遇到了一个问题,即每当字符串输入传入它的多个输入参数中的一个时,存储过程都不会给出任何结果(0行结果)。另一方面,当传递任何整型参数值时,但当我将
jdbc
driver从
jdbc:odbc
driver更改为
sqlserver
driver时,给出了正确的结果 (
driver name=com.microsoft.sqlserver.jdbc.SQLServerDrive
),问题已解决

现在,我的新问题是,当我的过程
procSearch2
运行时,它使用与
jdbc
驱动程序相同的
Connection
变量(更改了一个),但另一个过程有27个输入(
procSearch1
)即使传递了
int
string
输入值,也不会给出任何结果

它没有给出任何错误,只返回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"));

   }

 }

您需要为CallableStatement设置输出参数以读取sp的返回值。 类似于以下内容(为简洁起见,省略了异常处理):

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

见&

因此,您的代码应该类似于:

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"));
    }
}

sp有5个返回的输出值(表的5列),一些字符串和一些整数值。为此,我必须只添加一个输出参数吗?调用过程语法之前,即“{?=callprocsearch1(?,,?,?)}”。我刚才提到的另一个过程是,即使不使用registerOutParameter()或定义输出参数,也能给出非常好的结果;但当我打印**System.out.println(result.getRow());**内部结果=空块。另外,我在execute语句之后打印stmt.getUpdateCount(),它会给我-1个结果您是否尝试从后端执行第二个过程以查看它是否返回任何数据?是的,我在每一行进行了调试并检查了我的procSearch2会给出结果,但procSearch1不会。它jsut返回空行,根据sp在sql server中运行的时间,它应该返回3行。
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"));
    }
}