从数据库返回值与另一个结果集

Posted

技术标签:

【中文标题】从数据库返回值与另一个结果集【英文标题】:Return values from DB with another result set 【发布时间】:2016-04-18 04:12:35 【问题描述】:

我怎样才能执行这个语句并处理它java。是否有可能获得一个返回值,然后是下一个结果集,即按照我的方式选择员工?

我在 Google 上找不到执行我想要的准确方法,因为所有示例都是单个 SELECT 的结果,并且无法从 DB 中找到带有 RETURN 的查询。但是根据这个question,可以像.NET一样管理来自DB(java)的多个结果集。

我正在使用 postgresql 9.4,我不想使用存储过程(函数)来做我想做的事情。

这是我一直在尝试测试的代码,但我得到一个异常,即“IF”第 1 行存在语法错误

public Employee getEmployee(Connection con, String code) 
    Employee employee = new Employee();
    try 
        String query = 
                "IF EXISTS(SELECT * FROM employee WHERE code = ?) THEN "
                + "RETURN 1; "
                + "ELSE "
                + "RETURN 2; "
                + "END IF; "
                + "SELECT EmployeeID, FirstName FROM employee where code = ?; ";
        PreparedStatement stmt = con.prepareStatement(query);
        stmt.setString(1, code);
        stmt.setString(2, code);
        boolean hasResults = stmt.execute();
        int returnValue = 0;
        while(hasResults)
            ResultSet rs = stmt.getResultSet();
            returnValue = rs.getInt(1);
            if(returnValue == 1)
                hasResults = stmt.getMoreResults();
                while(hasResults)
                    employee.setId(rs.getInt("EmployeeID"));
                    employee.setFirstName(rs.getString("FirstName"));
                
            
        
        return employee;
     catch (Exception e) 
        System.out.println(e.getMessage());
        return null;
    

【问题讨论】:

【参考方案1】:

您使事情变得过于复杂(除了 SQL 中没有 if 的事实)。

只要运行选择,如果没有这样的员工,你会得到一个空的结果集:

public Employee getEmployee(Connection con, String code) 
    Employee employee = new Employee();
    try 
        String query = "SELECT EmployeeID, FirstName FROM employee where code = ?";
        PreparedStatement stmt = con.prepareStatement(query);
        stmt.setString(1, code);
        ResultSet rs = stmt.executeQuery();
        if (rs.next())
            employee.setId(rs.getInt("EmployeeID"));
            employee.setFirstName(rs.getString("FirstName"));
        
        return employee;
     catch (Exception e) 
        System.out.println(e.getMessage());
        return null;
    

您还可能希望将 Employee 实例的创建移动到 if (rs.next()) 内,以便如果不存在员工,您的方法将返回 null。上面的代码总是会返回一个Employee,即使没有


您还应该从查询字符串中删除;。尽管 Postgres 驱动程序会愉快地运行以 ; 结尾的语句,但这不符合 JDBC 并且其他驱动程序(或 DBMS)可能会拒绝运行它。

【讨论】:

感谢您的回答。我的问题就是一个例子。无论如何,我怎样才能得到返回值,然后是一个查询。我想在一个事务/执行中执行多个查询并获得多个结果集。但同时我希望能够执行功能,但不是专门在 DBMS 中预编译,而是作为查询字符串。

以上是关于从数据库返回值与另一个结果集的主要内容,如果未能解决你的问题,请参考以下文章

将值与可能较大的数据集进行比较

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

返回查询的所有行,其中一列中的字符串值与另一列中的字符串值匹配

Java JDBC 从不同的调用返回重复的结果集

参考光标和结果集

HSQL 过程从声明的表返回结果集