Result Set outra maneira [RESOLVIDO]

15 respostas
P

Olá pessoal.
Estou com uma dúvida.. precisava fazer um select no postgre e pegar o valor máximo dessa consulta, e colocar em uma variável, só que não consigo pegar

ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) as codProce FROM Processamento");    
			if (codProc.next()) { 
			int cod = codProc.getInt("codProce")+1;
			}

		sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, codProc.getInt("codProc")); // NÃO CONSIGO ADICIONAR AQUI O VALOR DA CONSULTA

Tentei dessa maneira, mas não consigo fazer funcionar,

Não quero colocar dentro de try ou while, pois tenho outras consultas sendo feitas em paralelo

// SÓ PARA MOSTRAR AS OUTRAS CONSULTAS
pl = conn.prepareStatement(SQL_SIMCARD_INSERE_PLANO);
			pl.setString(1, conta);
			pl.setString(2, plano);
			pl.setTimestamp(3,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pl.executeUpdate();
			
			li = conn.prepareStatement(SQL_SIMCARD_INSERE_LINHA);
			li.setString(1, linha);
			li.setInt(2, statusLinha);
			li.setString(3, conta);
			li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
			li.setTimestamp(5,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			li.executeUpdate();

15 Respostas

A
Pacato:
Olá pessoal. Estou com uma dúvida.. precisava fazer um select no postgre e pegar o valor máximo dessa consulta, e colocar em uma variável, só que não consigo pegar
ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo)  as codProce FROM Processamento");    
			if (codProc.next()) { 
			int cod = codProc.getInt("codProce")+1;
			}

		sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, codProc.getInt("codProc")); // NÃO CONSIGO ADICIONAR AQUI O VALOR DA CONSULTA

Tentei dessa maneira, mas não consigo fazer funcionar,

Não quero colocar dentro de try ou while, pois tenho outras consultas sendo feitas em paralelo

// SÓ PARA MOSTRAR AS OUTRAS CONSULTAS
pl = conn.prepareStatement(SQL_SIMCARD_INSERE_PLANO);
			pl.setString(1, conta);
			pl.setString(2, plano);
			pl.setTimestamp(3,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pl.executeUpdate();
			
			li = conn.prepareStatement(SQL_SIMCARD_INSERE_LINHA);
			li.setString(1, linha);
			li.setInt(2, statusLinha);
			li.setString(3, conta);
			li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
			li.setTimestamp(5,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			li.executeUpdate();

Não entendi para que vc esta dando este next aqui

if (codProc.next()) { 
			int cod = codProc.getInt("codProce")+1;
			}

Você recebe o valor direto na variavel, vai ser apenas um valor certo ? o max vai trazer apenas 1 valor

porque vc não faz assim:
"SELECT MAX (Processamento.Codigo) + 1  as codProce FROM Processamento"

e já atribui o valor para a sua variavel .... não vejo a necessidade do next .... apenas faça uma validação se o valor é nulo ou não, caso sua coluna no BD seja obrigatória ....

P

Como declarar direto para a variável?

você podia me passar?

E

Ele precisa do next. Não confunda a cabecinha do rapaz…

Provavelmente você faria algo como:

int cod = -1;
    ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) + 1 as codProce FROM Processamento");      
    if (codProc.next()) {   
        cod = codProc.getInt("codProce");  
    }  
  ...
    if (cod != -1) {
sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);  
    sc.setString(1, simCard);  
    sc.setInt(2, cod); 
    }

Mas usar select(MAX) para criar um novo código é coisa ultrapassada. É porque ele só funciona direito se você tiver apenas uma conexão na sua base (o que não costuma ser o caso).

Normalmente você deve usar uma sequence (no caso do Oracle e alguns outros bancos de dados) ou uma coluna com auto-increment, ou então, se o novo código precisa obedecer a uma regra complexa dentro do seu sistema, você precisa ter uma função apenas para gerá-lo corretamente (talvez através de uma outra tabela, ou através de um singleton).

P

cara me confundo…

Eu não posso usar uma condição aqui, pq tem outras consultas em paralelo a ser feite… eu preciso pegar o último valor (SLECT MAX) para pegar esse valor e adicionar em outra consulta, por isso to meio assim…

Precisa de algo assim mesmo, fazer um select direto pq só preciso desse valor e adicionar na variável, ResultSet me da nos nervos… pq da erro se declaro assim…

E

Suponha que a tabela Processamento seja vazia. O que ocorre quando você dá um Select (MAX)? O resultset vai ser vazio. é por isso que eu pus de propósito um valor “-1” - não sei se isso é o que você quer fazer. Quando à lógica da sua aplicação, eu não tenho a menor idéia de como é, ou como fazer, porque a aplicação é sua. Eu só dei uma idéia, não é para copiar o código na sua aplicação e reclamar por que ela não funciona. Você tem de entender o que eu fiz - joguei a variável para fora do if, porque dentro do if o valor “desaparece”.

P

Eu entendi entanglement

Não to reclamando do seu código… não entenda mal…

É que quando uso o Resultset dentro do método, ele da nullpointer…

Por isso queria outra maneira de fazer o select e pegar o valor… esse valor nunca será nulo ou vazio, pois eu faço insert antes de fazer o select… e ele é incremental como vc falou, só que preciso desse valor para incluir em outra tabela…

Entendeu?

E

E é por isso que eu evitei usar o “codProc.getInt” que você pôs e reaproveitei o valor que você obteve do código, jogando na variável “cod” (que você declarou no escopo errado). Provavelmente o “codProc” está nulo e isso é que está dando problemas

P

Amigo.. ainda ta com erro.. e não ta vazio...

ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) as codProce FROM Processamento");           
			int cod = codProc.getInt("codProce")+1;     
 
			
			sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, cod);

Esse ResultSet coloquei como "desespero" como exemplo para onde eu quero...

E
ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) as codProce FROM Processamento");             
int cod = -1;
if (codProc.next()) {
    cod = codProc.getInt("codProce")+1;       
}

Note que getInt não funciona de jeito nenhum se você não ler o registro para a memória, usando next().
O next() não existe só para você testar se existe um próximo registro: ele serve para carregar o registro para a memória.
O nome dele é uma droga porque não diz o que ele realmente faz, que é tentar carregar um registro, e se conseguir, retornar true.

P

mesmo eu definindo assim, da nullpointer...

Método completo

public boolean simCardInsereTelecom(String simCard, String linha,
			int apnUtilizada, String conta, int operadora, String plano,
			int statusSIMCard, Date dtAtivacao, int fonte, int statusLinha,
			String imsi, String consumoDados) {
		boolean insere = false;
		boolean existe = false;
		Connection conn = null;
		PreparedStatement codP = null;
		PreparedStatement pr = null;
		PreparedStatement co = null;
		PreparedStatement pl = null;
		PreparedStatement li = null;
		PreparedStatement sc = null;
		
		
		try {
			
			conn = ConnectionManager.obterConexao();
			pr = conn.prepareStatement(SQL_SIMCARD_INSERE_PROCESSAMENTO);
			pr.setInt(1, fonte);
			pr.setTimestamp(2,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pr.executeUpdate();
			
			conn = ConnectionManager.obterConexao();
			co = conn.prepareStatement(SQL_SIMCARD_EXISTE_CONTA);
			co.setString(1, conta);
			existe = co.executeQuery().next();
			if (!existe){
			co = conn.prepareStatement(SQL_SIMCARD_INSERE_CONTA);
			co.setString(1, conta);
			co.setTimestamp(2, 
					new java.sql.Timestamp(new java.util.Date().getTime()));
			co.executeUpdate();
			}
			pl = conn.prepareStatement(SQL_SIMCARD_INSERE_PLANO);
			pl.setString(1, conta);
			pl.setString(2, plano);
			pl.setTimestamp(3,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pl.executeUpdate();
			
			li = conn.prepareStatement(SQL_SIMCARD_INSERE_LINHA);
			li.setString(1, linha);
			li.setInt(2, statusLinha);
			li.setString(3, conta);
			li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
			li.setTimestamp(5,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			li.executeUpdate();

			ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) as codProce FROM Processamento");               
			int cod = -1;   
			if (codProc.next()) {   
			    cod = codProc.getInt("codProce")+1;         
			}   
			
			sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, cod);
			sc.setString(3, linha);
			sc.setInt(4, statusSIMCard);
			sc.setInt(5, apnUtilizada);
			sc.setInt(6, operadora);
			sc.setString(7, imsi);
			sc.setString(8, consumoDados);
			sc.setDate(9, new java.sql.Date((dtAtivacao).getTime()));
			sc.executeUpdate();

			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, co);
			ConnectionManager.fecharConexao(conn, null, pl);
			ConnectionManager.fecharConexao(conn, null, li);
			ConnectionManager.fecharConexao(conn, null, sc);
		}

		return insere;
	}
E

Por que você não usa sequence ou campo auto-incremento como falaram?

Isso que você está tentando fazer não é nada seguro. Você mesmo disse que acontecem outras transações em paralelo… E se no momento que você pega o último valor com o MAX este não voltar o valor que você acabou de adicionar?

A
Pacato:
mesmo eu definindo assim, da nullpointer...

Método completo

public boolean simCardInsereTelecom(String simCard, String linha,
			int apnUtilizada, String conta, int operadora, String plano,
			int statusSIMCard, Date dtAtivacao, int fonte, int statusLinha,
			String imsi, String consumoDados) {
		boolean insere = false;
		boolean existe = false;
		Connection conn = null;
		PreparedStatement codP = null;
		PreparedStatement pr = null;
		PreparedStatement co = null;
		PreparedStatement pl = null;
		PreparedStatement li = null;
		PreparedStatement sc = null;
		
		
		try {
			
			conn = ConnectionManager.obterConexao();
			pr = conn.prepareStatement(SQL_SIMCARD_INSERE_PROCESSAMENTO);
			pr.setInt(1, fonte);
			pr.setTimestamp(2,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pr.executeUpdate();
			
			conn = ConnectionManager.obterConexao();
			co = conn.prepareStatement(SQL_SIMCARD_EXISTE_CONTA);
			co.setString(1, conta);
			existe = co.executeQuery().next();
			if (!existe){
			co = conn.prepareStatement(SQL_SIMCARD_INSERE_CONTA);
			co.setString(1, conta);
			co.setTimestamp(2, 
					new java.sql.Timestamp(new java.util.Date().getTime()));
			co.executeUpdate();
			}
			pl = conn.prepareStatement(SQL_SIMCARD_INSERE_PLANO);
			pl.setString(1, conta);
			pl.setString(2, plano);
			pl.setTimestamp(3,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pl.executeUpdate();
			
			li = conn.prepareStatement(SQL_SIMCARD_INSERE_LINHA);
			li.setString(1, linha);
			li.setInt(2, statusLinha);
			li.setString(3, conta);
			li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
			li.setTimestamp(5,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			li.executeUpdate();

			ResultSet codProc = codP.executeQuery ("SELECT MAX (Processamento.Codigo) as codProce FROM Processamento");               
			int cod = -1;   
			if (codProc.next()) {   
			    cod = codProc.getInt("codProce")+1;         
			}   
			
			sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, cod);
			sc.setString(3, linha);
			sc.setInt(4, statusSIMCard);
			sc.setInt(5, apnUtilizada);
			sc.setInt(6, operadora);
			sc.setString(7, imsi);
			sc.setString(8, consumoDados);
			sc.setDate(9, new java.sql.Date((dtAtivacao).getTime()));
			sc.executeUpdate();

			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, co);
			ConnectionManager.fecharConexao(conn, null, pl);
			ConnectionManager.fecharConexao(conn, null, li);
			ConnectionManager.fecharConexao(conn, null, sc);
		}

		return insere;
	}

Opa vamos lá , você já debugou seu código ? o que vc tá fazendo aqui ResultSet codProc tá retornando algum valor ?

P

Quando ele chega na linha do result set, ele da nullpointer…

e aquele esquema que vc falou de fazer select dirto na variável??

Pessoal, o problema não esta no autoincremento, e sim no pegar o valor de um select, depois eu somo um para adicvionar em outra tabela…

A

Faça assim :

int cod = 0; Statement st = suaconexao.createStatement(); st.executeQuery ("SELECT MAX(Codigo) FROM Processamento"); ResultSet codProc = st.getResultSet(); while ( codProc.next() ){ cod = rs2.getInt(1); cod++; }

Veja se funciona …

P

Valeu pessoal, criei um método

private static final String SQL_SIMCARD_COD_PROCESSAMENTO = "SELECT MAX (Processamento.Codigo) as codProce FROM Processamento";

public int CodigoProcessamento(){
		Connection conn = null;
		PreparedStatement stmt = null;
		int cod = 0;
		try{
		conn = ConnectionManager.obterConexao();
		stmt = conn.prepareStatement(SQL_SIMCARD_COD_PROCESSAMENTO);
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()) {
			cod = rs.getInt("CodProc");
		}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, stmt);
		}

		return cod;
	}

ai chamo o método

sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, CodigoProcessamento());
Criado 25 de outubro de 2012
Ultima resposta 26 de out. de 2012
Respostas 15
Participantes 4