【问题标题】:ResultSet only returns one row when more exist in the database当数据库中存在更多时,ResultSet 仅返回一行
【发布时间】:2018-02-28 02:12:41
【问题描述】:

我在该类中创建了一个名为 Executar_Query_Bd_Multiplos_Resultados 的 java 类,作为整数类型的 Conectar 方法 2 值(int Integer1,int Integer2)的参数。

查询接收到这些值:

"SELECT DS_ESTRATEGY, STRID_ID" +
    "FROM TB_BKOFFICE_ESTRATEGY" +
    "WHERE IN_STRATEGY_ID IN (" + Istrategy1 + "," + Istrategy2 + ")";

上述查询的结果存储在变量ls_command中。

在 Executar_Query_Bd_Multiplos_Resultados_Test 类中,我进行方法调用 (Connect) 和步骤 2 参数 (179, 319) 以及在屏幕上打印 String 类型的变量 codEstrategies 的命令。

但 Eclipse 只在控制台上显示 1 个结果。查询应该带来 2 个结果,而不是 1 个。这是 Java 类的代码和在 Oracle SQL Developer 中执行的查询结果。

public class Executar_Query_Bd_Multiplos_Resultados_Test {

@Before
public void setUp() throws Exception {

    Executar_Query_Bd_Multiplos_Resultados qr_2 = new Executar_Query_Bd_Multiplos_Resultados();
    String codEstrategias = qr_2.Conectar(179, 319);
    System.out.println("Estratégias: " + codEstrategias);

}

@After
public void tearDown() throws Exception {
}

@Test
public void test() {
}
}

public class Executar_Query_Bd_Multiplos_Resultados {
//Variáveis de BD
Connection conOracle = null;
Statement stmtOracle = null;
ResultSet rsetOracle = null;

public String Conectar(int Id_Estrategia1, int Id_Estrategia2) {

    String retorno = "#;-1;@";

    Boolean lb_continuar = true;
    //StringBuilder ls_comando = new StringBuilder();
    String ls_comando = new String();

    try {
        System.out.println("Conectando ao banco de dados Oracle...");
        String url = "";
        try {
            //conectando aos bancos de dados
            Class.forName("oracle.jdbc.driver.OracleDriver");
            url = "jdbc:oracle:thin:@10.5.12.116:1521:desenv01";
            DriverManager.setLoginTimeout(10);
            conOracle = (Connection) DriverManager.getConnection(url, "bkofficeadm", "bkofficeadmdesenv01");
        } catch (SQLException e) {
            System.out.println("falha SQL >> " + e.getMessage());
        } catch (Exception e) {
            //System.out.println("falha geral >> " + e.getMessage());
            e.printStackTrace();
            lb_continuar = false;
        }
        //String teste = "'BKO - Rep Conectividade'";
        if (lb_continuar) {
            System.err.println("Preparando comando...");
            System.out.println("");

            ls_comando = "SELECT  DS_ESTRATEGIA, ID_ESTRATEGIA"+
                                  " FROM TB_BKOFFICE_ESTRATEGIA"+
                                  " WHERE ID_ESTRATEGIA  IN (" + Id_Estrategia1 + ", " + Id_Estrategia2 + ")";  


            System.out.println(ls_comando);

            stmtOracle = conOracle.createStatement();
            stmtOracle.setQueryTimeout(10);
            rsetOracle = stmtOracle.executeQuery(ls_comando.replaceAll("\n", " ").trim());

            if(rsetOracle.next()) {
                retorno   = rsetOracle.getString(1);
            }              
            rsetOracle.close();
            stmtOracle.close();             
            /*
            Para comandos de Insert, Delete, ou Update
            --------------------------------------------------------
            stmtOracle = conOracle.createStatement();
            stmtOracle.setQueryTimeout(10);
            stmtOracle.execute(variavel_comando.toString());
            conOracle.commit();
            stmtOracle.close();
            */
        } 
    } catch (Exception ex) {
        System.out.println("Erro - " + ex.getMessage());
    } finally {
        try {
            if (rsetOracle != null) {
                rsetOracle.close();
            }
        } catch (Exception e) {
            System.out.println("Erro ao fechar rset - " + e.getMessage());
        }
        try {
            if (stmtOracle != null) {
                stmtOracle.close();
            }
        } catch (Exception e) {
            System.out.println("Erro ao fechar stmt - " + e.getMessage());
        }
        try {
            if (conOracle != null && !conOracle.isClosed()) {
                conOracle.close();
            }
            if (conOracle != null && !conOracle.isClosed()) {
                conOracle.close();
            }
        } catch (Exception e) {
            System.out.println("Erro ao fechar con  - " + e.getMessage());
        }
    }
    return retorno;

}
}

SQL Devleoper 查询的输出:

Eclipse 控制台的输出:

【问题讨论】:

  • 您调用一次rSet.next() 并从该单行分配retorno = rsetOracle.getString(1)。你期望会发生什么?而且您的方法返回一个字符串,那么您希望它如何处理结果集中的两个字符串值 - 将它们连接起来? (另外,please don't use images if you can use text。)。
  • 你好 Alex Poole,我不久前开始使用 java 来自动化测试。需要在返回 2 个(或更多值)值的数据库中执行 SELECT。我知道如何在 Java 中执行 SELECT 以返回 1 个值,但我不知道如何使用 Java 来返回 2 个或更多值。您能帮忙调整我的代码以使其正常工作吗?
  • corsiKa 展示了如何遍历查询返回的多行。但我们不知道你想用它们做什么。您正在返回一个字符串值,这可能不是您想要的;也许你想要一个收藏? (现在对该答案的编辑显示;您的返回类型和调用者需要更改以匹配)。

标签: java resultset


【解决方案1】:

你正在这样做

if(rsetOracle.next()) {
    retorno   = rsetOracle.getString(1);
}   

运行一次

请考虑while:

List<String> retornos = new ArrayList<>();
while(rsetOracle.next()) {
    retornos.add(rsetOracle.getString(1));
}   

这将一直运行,直到您的行数用完为止。

如果将来发生类似情况,您需要将查询修改为select count(*) ... 并验证您在数据库工作台和您的 javacode 中获得相同的结果。然后,您至少会知道您的查询是正确的,而失败的是您的演示文稿。


注意:

我知道这个问题确实与其他问题重复。但是,这些很难搜索。我建议这是一个规范的答案。

【讨论】:

  • 现在return retorno; 将从找到的最后一行返回值,而不是从第一行返回;所以 OP 仍然必须决定他们希望如何返回或处理多个字符串。
  • 好点。这不仅仅是将if 变成while
  • 按照建议,我将代码更改为: if(rsetOracle.next()) { retorno = rsetOracle.getString(1);对于: List retornos = new ArrayList();而(rsetOracle.next()){retornos.add(rsetOracle.getString(1));并且 Eclipse 控制台显示了错误消息: Strategies: #; - 1; @
  • @Kakashi-Sensei 不,这不是建议。我不建议保留if 声明。我建议用while 替换if,而不是让一个retono 拥有retornos 列表
  • 感谢您的贡献。我将继续在互联网上搜索其他访问数据库的方法。
猜你喜欢
  • 2020-09-06
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多