Result Set outra maneira [RESOLVIDO]

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

[code] 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

[/code]

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();

[quote=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

[code] 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

[/code]

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

[code]
// 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();

[/code][/quote]

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 …

Como declarar direto para a variável?

você podia me passar?

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).

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…

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”.

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 é 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

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

[code] 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);

[/code]

Esse ResultSet coloquei como “desespero” como exemplo para onde eu quero…

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.

mesmo eu definindo assim, da nullpointer…

Método completo

[code] 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;
}[/code]

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?

[quote=Pacato]mesmo eu definindo assim, da nullpointer…

Método completo

[code] 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;
}[/code][/quote]

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

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…

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 …

Valeu pessoal, criei um método

[code]
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;
}[/code]

ai chamo o método

sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD); sc.setString(1, simCard); sc.setInt(2, CodigoProcessamento());