É possível concatenar ResultSet?Como?

Boas…
Eu estou tendo um problema, pois estou tendo a necessidade de Quebrar um SELECT em duas ou + vezes, devido ao IN suportar uma lista de 1000 itens…no meu caso essa lista tem 1158…Aí eu pego os 1000 primeiros, execulto e armazeno em um resultSet “rsAux”, jogo no rsFull(esse deverá armazenar todos rsAux)… o código segue abaixo::

public static RSModel getRelatorio(java.util.Date de, java.util.Date ate, int idFilial) throws BioException {
    //inicializaMeses();
    
    try {

        String sql= "";
        List id_lancto = new ArrayList();
        String numero_nota="", numero_nota_ant ="";
        
        sql = "" +
        "SELECT n.numero_nota, l.id_lancamento " +
        "FROM nota_fiscal n, " +
        "     lancamento  l  " +
        "WHERE TRUNC(n.data_emissao) BETWEEN TRUNC("+ DateUtil.toSQL(de) +") AND TRUNC("+ DateUtil.toSQL(ate) +") " +
        "  AND n.id_lancamento   = l.id_lancamento " +
        "ORDER BY n.numero_nota " ;
        Statement st = ConnectionPool.getConnection().createStatement();
        ResultSet rs = st.executeQuery(sql);

        while(rs.next()){

            numero_nota = rs.getString(1);
            if(!numero_nota.equals(numero_nota_ant)){
                id_lancto.add(""+rs.getInt(2));
            }
            numero_nota_ant = numero_nota;
            
        }
        
        String tmp = "";
        int vezes = 0;
        
        if (id_lancto.size() > 1000){
            double size = id_lancto.size();
            double cont = id_lancto.size() / 1000; 
            vezes = Math.ceil(cont);
        }
        
        ResultSet rsFull = null;
        double j = 1; 
        while(j <= vezes){

            if (id_lancto.size() > 999){ 
                
                for(int aux = 0; aux < 999; aux++){
                    tmp += id_lancto.get(aux) + ", ";
                }

                for(int auxT = 999; auxT > 0; auxT--){
                    id_lancto.remove(auxT);
                }                    
                tmp = tmp.toString().substring(1, tmp.toString().length()-1);
            }
            else{
                tmp = id_lancto.toString().substring(1, id_lancto.toString().length()-1);
            }

            sql ="" +
            "SELECT  compra.id_compra, cliente.cpf, serie_nota, numero_nota, " +
            "valor_nota, data_emissao, nota_fiscal.cancelado " +
            "FROM cliente, nota_fiscal, lancamento, compra " +
            "WHERE TRUNC(data_emissao) >= TRUNC("+ DateUtil.toSQL(de) +") " +
            "  AND TRUNC(data_emissao) <= TRUNC("+ DateUtil.toSQL(ate) +") " +
            "  AND cliente.id_cliente = compra.id_cliente " +
            "  AND lancamento.id_lancamento IN (SELECT id_lancamento " +
            "                                   FROM lancamento l " +
            "                                   WHERE l.id_compra     = compra.id_compra" +
            "                                     AND l.id_lancamento IN ("+ tmp +"))" +
            "  AND nota_fiscal.id_lancamento = lancamento.id_lancamento " +
            "  AND lancamento.id_caixa IN (SELECT id_caixa " +
            "                              FROM caixa " +
            "                              WHERE id_centro_custo IN (SELECT id_centro_custo " +
            "                                                        FROM centro_custo " +
            "                                                        WHERE id_filial = "+ idFilial + ")) " +
            "ORDER BY numero_nota " ;

            Statement stAux = ConnectionPool.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rsAux = stAux.executeQuery(sql);
            rsFull += rsAux;  /* ------------------ O ERRO OCORRE NESSA LINHA */
            j++;
            
        }
        return new RSModel(rsFull);
    } 
    catch(SQLException e) {
        e.printStackTrace(System.err);
        BioException ex = new BioException("Erro ao selecionar relatório de débito automático.");
        ex.fillInStackTrace();
        throw (ex);
    }
}

Por que você não junta ambos os resultados num ArrayList?

dica: quando for postar código, coloque-o entre as tags [ code]seucodigo[ /code], assim ele ficará endentado.

[quote=LIPE]Por que você não junta ambos os resultados num ArrayList?

dica: quando for postar código, coloque-o entre as tags [ code]seucodigo[ /code], assim ele ficará endentado.[/quote]

Não dá para juntá-los no arrayList, pois esse é usado apenas para controlar os Ids no select para não ultrapassar os 1000 que o IN suporta, e eu só executo os SELECT e retorno esse ResultSet.
Eu tenho que unir esses resultSet em um só…

Dicas:

1 - Use uma PreparedStatement
2 - += Só funciona com números, não há sobreacarga de operadores em Java
3 - Se você precisa filtrar resultados, tente melhorar seu SQl. Como eu não entendi direito o mque você quer, não posso opinar =/
4 - Seus registros devem guardar estados de objetos, não manipule um ResultSet diretamente

[]s

[quote=pcalcado]Dicas:

1 - Use uma PreparedStatement
2 - += Só funciona com números, não há sobreacarga de operadores em Java
3 - Se você precisa filtrar resultados, tente melhorar seu SQl. Como eu não entendi direito o mque você quer, não posso opinar =/
4 - Seus registros devem guardar estados de objetos, não manipule um ResultSet diretamente

[]s[/quote]

Boas…
Como eu tive a necessidade de quebrar o SELECT EM partes, surgiu outra necessidade, a de juntar os resultSet criados, em um só!!
Seria concatenar os resultSet.

Ok, vamos ver se entendi…

Vc tem um consulta grande, que dividiu em duas, logo vc obtêm 2 resultsets.

Você precisad e algo que pareça com um resultset só.

Soluçao 1 (PORCA!):
Para cada row, crie um map, armazene os maps num ArrayList

Solução 2 (USE ESSA):
Recrie os objetos representados pelo resultset e os armazene num ArrayList

[]s

Pegando no peh:

+= funciona com Strings, tambem - mas, de fato, nao existe sobrecarga de operadores no Java exceto o ‘+’ pra Strings :slight_smile:

[quote=pcalcado]Ok, vamos ver se entendi…

Vc tem um consulta grande, que dividiu em duas, logo vc obtêm 2 resultsets.

Você precisad e algo que pareça com um resultset só.

Soluçao 1 (PORCA!):
Para cada row, crie um map, armazene os maps num ArrayList

Solução 2 (USE ESSA):
Recrie os objetos representados pelo resultset e os armazene num ArrayList

[]s[/quote]

Puts…eu imaginei isso, estava tentando fugir dessa solução, mas pelo que estou vendo não será possível “concatenar os resultset”…Valeu pelo help…caso descubra algo desse tipo diga-me…

Cv, aquele carequinha barbudo tá te chamando lá ó.

Que consulta longa… Será que seu banco agüenta uma query do tipo

select ... in ( ... ) 
UNION
select ... in ( .... )

?
Ou então ter uma tabela temporária (argh) só para não ter de fazer esse “in” esquisito?

Cara é o seguinte se ut tiver usando banco oracle eu consigo fazer um select bala que vai trazer os dois resultados em unico result set.
Você também pode optar por criar uma view da parada que fica melhor ainda fazendo tudo pelo banco dae so mandar um :
select * from nome_view where bam bam bam

Em consultas muito complexas é muito bom usar views

Não sei se é isso que tu quer mas to tentando ajudar

Dae so uma dica : Da uma olhada na necessidade do order by dependendo da contidade de registros ele pode demorar muito e retirar esta clausala seria uma condição a se pensar em performance de dml