ExecuteQuery返回null,而execute语句返回true

时间:2018-10-05 17:11:13

标签: java oracle jdbc

这是我的Java代码,试图从数据库中获取ResultSet。

    try{

        ps=conn.prepareStatement(QueryMapper.SCHEDULE_APPLICANT_STATUS);
        ps.setString(1,schedule_id);
        rs1=ps.execute();
        System.out.println(rs1);
        ResultSet rs = null;
        while(rs1)
        {
            rs=ps.executeQuery();
            System.out.println(rs.next());
            Application applicationBean= new Application();
            System.out.println("ABC"+schedule_id);
            applicationBean.setScheduledProgramId(rs.getString(3)); 
            applicationBean.setStatus(rs.getString(2)); 
            applicationBean.setApplicantId(rs.getString(1)); 
            applicationList.add(applicationBean);
            applicationCount++;
        }

    }catch (SQLException sqlException) {
        log.error(sqlException.getMessage());
        System.out.println(sqlException.getMessage());
    }

当我尝试运行此命令时,无法使用executeQuery语句在rs处获取结果集。当我尝试使用execute语句执行时,它返回了true,这意味着正在返回某些结果集。为什么我的executeQuery返回null。

我要运行的sql查询是

  

从* SCHEDULED_PROGRAM_ID =的应用程序中选择*

此查询在sql管理器中执行时运行良好并获取结果。

你能告诉我我做错了什么吗

3 个答案:

答案 0 :(得分:2)

在所示的代码中,rs仅在null为假时才为rs1,这仅在执行不产生结果集的情况下才是这种情况(或者您的JDBC驱动程序有错误,但是可能性很小)。

但是您在做什么,没有任何意义。如果使用execute(),则不应再次执行查询以获取结果集。这样做效率低下,因为您要数据库服务器重做它对第一个execute()所做的工作,请改用getResultSet()。如PreparedStatement.execute()所述:

  

execute方法返回一个boolean来指示   第一个结果。您必须调用方法getResultSet或   getUpdateCount检索结果;你必须打电话   getMoreResults移至任何后续结果。

但是,如果您知道正在执行的查询会产生一个结果集(并且选择总是会产生一个结果集,即使它为空!),那么您应该使用{{1 }}。这样可以简化您的代码。

您的代码也有一个无限循环。您是要使用executeQuery()而不是if (rs1)吗?

您应该将代码更改为类似

while(rs1)

答案 1 :(得分:1)

您不需要两个ResultSet对象,只需要执行一次PreparedStatement。典型的模式是:

rs = ps.executeQuery();
while (rs.next()) {
    // process the row returned by next()
    // e.g.,
    System.out.println(rs.getString(1));
}

答案 2 :(得分:-1)

您缺少读者。 它必须类似于:while(rs1.read())