Select traz sempre o mesmo valor

Boa tarde, tenho 2 selects, o primeiro traz 2 ids, e o while vai rodar o laço por duas vezes…
Até ai tudo bem…
Vou colocar o código abaixo para facilitar:

String sqlMeters = “select oid_meter from rs_meter where oid_uc = ? and (oid_type_meter = 2 or oid_type_meter = 3)”;
PreparedStatement stmtMeters = conn.prepareStatement(sqlMeters);
stmtMeters.setLong(1, idUc);
ResultSet rsMeters = stmtMeters.executeQuery();

    PreparedStatement stmt = null;
    ResultSet rs = null;
    
    while(rsMeters.next()) {
        
        String sql = "select pck_leitura.get_max(?, ?, ?, ?, ?, ?, ?+30, 30) as leitura from dual";
        stmt = conn.prepareStatement(sql);
        stmt.setLong(1, idSystem);
        stmt.setLong(2, idUc);
        stmt.setString(3, rsMeters.getString("oid_meter"));
        stmt.setDouble(4, mConstant);
        stmt.setLong(5, mConcentrator);
        stmt.setLong(6, mPort);
        stmt.setTimestamp(7, dtEnd);
    
    rs = stmt.executeQuery();
        if(rs.next()) {   
            try {
                String strLeitura = rs.getString("leitura");
                if(strLeitura.contains("|")) {
                    
                    answer.add("consumption", since);
                    
                    String[] leituraTokens = strLeitura.split("\\|");
                    SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyHHmmss");
                    Date dt = sdf.parse(leituraTokens[0]);
                    double value = DecimalFormat.getInstance(Locale.ENGLISH).parse(leituraTokens[1]).doubleValue();
                    addField(since, "date_read", dt);
                    addField(since, "read_value", value);
                    addField(since, "consumption", value - read0);
    
                    tariffName = billRS.getString("NAME_TARIFF");
                    addField(since, "tariff_name", tariffName);
                    
                    double actualConsumption = value - read0;
                    projection = getProjection(since, dtEnd, dt, actualConsumption) + projection;
                    
                    stmt.close();
                    rs.close();
                    stmt = null;
                    rs = null;
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            }
    
    }

    stmtMeters.close();
    rsMeters.close();

A package no banco deveria trazer um valor para o id1 para a variavel String[] leituraTokens = strLeitura.split("|"); e outro valor para o segundo id do laço porém ele trazer o mesmo valor para os dois…
Conferi os parametros que estão sendo passados e estão corretos… no segundo laço vem um novo
stmt.setString(3, rsMeters.getString(“oid_meter”)) e deveria trazer outro valor no String[] leituraTokens = strLeitura.split("|");…

Minha dúvida é, isso acontece por não estar finalizando a package?
Pq esta acontecendo isso?

Obrigado!

a sua ideia é escapar a barra invertida ou o pipe. se for a barra invertida tudo bem mais se for o pipe é assim:

String[] leituraTokens = strLeitura.split(Pattern.quote("|"));

Boa tarde amigo, agradeço sua atenção, mas isto não esta causando o problema.
No debug, o valor dentro do strLeitura vem normal e não da nenhuma exception.
Meu problema é a package trazer o mesmo valor para o primeiro id do laço e para o segundo…

isso é uma função criada no oracle??

Sim… dentro do java eu chamo essa função…

Segue a função dentro do oracle:

create or replace package pck_leitura is

function get_min(v_id_system integer, v_id_uc integer, v_id_meter integer, p_constant number, v_conc integer, v_port integer, v_data date, v_max_dias integer) return varchar2;
function get_max(v_id_system integer, v_id_uc integer, v_id_meter integer, p_constant number, v_conc integer, v_port integer, v_data date, v_max_dias integer) return varchar2;

end pck_leitura;

use
CallableStatement stmt = conn.prepareCall(sql);

nessa parte o +30 vc coloca[quote=“marcogabriel30, post:1, topic:355841”]
stmt.setTimestamp(7, dtEnd);
[/quote]

stmt.setTimestamp(7, dtEnd + 30);

Obrigado novamente blayd2015 mas continua trazendo o mesmo registro para strLeitura :frowning:

Sim para que traga somente 1 linha certo?
Porém como na parte abaixo eu “zero” o result fecho ele e o stmt e faço novamente, ele deveria trazer um novo registro pois no segundo laço o terceiro parametro ( rsMeters.getString(“oid_meter”)); ) muda e isso deveria alterar o resultado…não?

é… a ideia é essa mesmo…

tenta a cada iteração atribuir + 30 na variavel dtEnd

assim:

    dtEnd += 30;
    stmt.setTimestamp(7, dtEnd);

Obrigado blayd2015, mas o periodo é sempre o mesmo e esta rolando certinho, o problema parece ser a package, ela parece não estar sendo finalizada do laço 1 para o laço 2 entendeu?
Parece que quando seto os valores novamente ele não sobrescreve, mesmo eu forçando abaixo setando o stmt null e o rs null… parece que ela não é feita com o novo valor de rsMeters.getString(“oid_meter”)…

:frowning:

Só para efeito de não deixar sem resposta.
Alterei o select sem mexer na package e resolvi o problema.
A ideia do blayd2015 foi até bacana e por ter ajudado vou colocar como a solução.

Obrigado!

1 curtida