JDBC - como faço para percorrer todas as colunas de várias tabelas ao mesmo tempo?

11 respostas
E

Bom dia a todos, preciso de uma ajuda. Gostaria de saber, como faço para percorrer cada campo, de várias tabelas ao mesmo tempo ?

eu sei que Select * from table ;

e dpois faz um resultSet, rs.getString();

cria um resultMetaData pegando quantidade de colunas e percorre elas,

assim eu consigo percorrer uma tabela inteira, ou seja apenas 1 tabela.

como faço para ser em várias ?

11 Respostas

M

existem várias maneiras, mas eu, ou faria um select envolvendo as outras tabelas,

select * from tabela1 1, tabela2 2, tabela3 3

ou trabalharia com threads fazendo um select de cada vez…

P

Creio que seja mais performático fazer tudo em uma única select, pois toda a operação é realizada pelo banco e pode prover mais performance (caso a select esteja construída de acordo com as especificações do seu BD).

B

Mais fácil fazer um dump do banco que percorrer tabelas assim sem critério algum.

E

Beleza, até ai eu posso dizer q sei. O problema é o seguinte:

vou da um exemplo:

eu tenho 3 tabelas ok ?

Nome, endereço e telefone.

então eu quero percorrer as 3

e quero fazer uma alteração em um dado tempo determinado.

ou seja:

try {
			PreparedStatement Pstmt1 = this.conexao
			   .prepareStatement("SELECT nome_proprietario_imovel_principal FROM Propriedade");
			
			ResultSet rs = Pstmt1.executeQuery();
			
								
			while(rs.next()){


if (rs.getString(1).equals(null)) {
					
					Pstmt1 = this.conexao
					   .prepareStatement("UPDATE Propriedade SET nome_proprietario_imovel_principal  = ?");
		                        
				
					
					Pstmt1.setString(1, "xxxxxxx");
				
					Pstmt1.execute();
				}

ou seja, o meu objetivo ae era, quando fosse encontrado campo do tipo " null " , ele preencheria com “xxxxxx”,

mas não ta dando certo.

como faço dentro de um rs.next() , executar um comando sql ? tem como ? alguem pode me da uma força. ?

B

UPDATE Propriedade SET nome_proprietario_imovel_principal = 'xxxxxxx' WHERE nome_proprietario_imovel_principal is null Seria isso?

E

isso mesmo mano. valeu… =D … agora deu outro pro no meu programa.

se liga ae.

esse método era para verificar os campos que tinha null. Ou seja, seria este:

public void verificaBranco(){
		
		   try {
			PreparedStatement Pstmt1 = this.conexao
			   .prepareStatement("SELECT nome_proprietario_imovel_principal FROM Propriedade");
			
			ResultSet rs = Pstmt1.executeQuery();
			
								
			while(rs.next()){
				
				if (rs.getString(1) == null) {
					
					
					Pstmt1 = this.conexao
					   .prepareStatement("UPDATE Propriedade SET nome_proprietario_imovel_principal  = ? WHERE nome_proprietario_imovel_principal is null");
		                        
				
					
					Pstmt1.setString(1, "xxxxxxx");
				
					Pstmt1.execute();
				}
				
				//else {
				//	if (rs.getString(2) == null) {
				//		Pstmt1.execute("INSERT INTO Propriedade VALUES(' ')");
					}	
				//		 else {
				//			 if (rs.getString(3) == null) {
				//					Pstmt1.execute("INSERT INTO Municipios VALUES(' ')");
				//					
				//				}
				//		}
					
			
				//}
			//}
		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
		
		
	}

logo dpois desse, eu utilizo o seguinte método, que puxa esse.

public void insereDados(ConexaoDAO conexao){
		
		Produtor produtor = new Produtor();
		
		this.verificaBranco();
		 
		
		   try {
	            

	            PreparedStatement Pstmt1 = this.conexao
	                    .prepareStatement("SELECT nome_produtor,nome_proprietario_imovel_principal FROM Produtor prod,Propriedade prop WHERE prod.cod_produtor < 10 AND prop.cod_produtor < 10");

	            ResultSet rs = Pstmt1.executeQuery();
	           
	            int chave = 700000;
	            while (rs.next()) {

	                produtor.setNomeProdutor(rs.getString(1));

	            //    String nome = rs.getString(2);
	                                               
	                    if (rs.getString(2).equals(produtor.getNomeProdutor())) {

	                        Pstmt1 = this.conexao
	                                .prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");

	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "1");
	                        Pstmt1.execute();

	                    }else {
	                                                               
	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "2");
	                        Pstmt1.execute();
	                       
	                   
	                    }
	                   
	               
	               

	                chave++;
	               
	            }
	            // PreparedStatement Pstmt2 =
	            // this.conexao.prepareStatement("SELECT nome_proprietario_imovel_principal FROM Propriedade WHERE cod_produtor = 10");

	            // rs = Pstmt2.executeQuery();

	            // while(rs.next()){

	            // String nome = rs.getString(1);

	            // if (nome.equals(produtor.getNomeProdutor())) {

	            // Pstmt2 =
	            // this.conexao.prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");

	            // Pstmt2.setString(1, "700.000");
	            // Pstmt2.setString(2, "1" );
	            // Pstmt2.execute();

	            // System.out.println(produtor.getNomeProdutor());
	            // }

	            // }

	            Pstmt1.close();
	            // Pstmt2.close();

	        } catch (SQLException e) {

	            e.printStackTrace();
	        }
		
	}

ae da o seguinte erro:

Exception in thread "main" java.lang.NullPointerException
	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(Unknown Source)
	at projeto2.DAO.ConexaoDAO.insereDados(ConexaoDAO.java:112)
	at projeto2.DAO.Teste.main(Teste.java:13)

saberia me dizer o porquê ?

B
EuclidesFilizola:
public void verificaBranco(){
		
		   try {
			PreparedStatement Pstmt1 = this.conexao
			   .prepareStatement("SELECT nome_proprietario_imovel_principal FROM Propriedade");
			
			ResultSet rs = Pstmt1.executeQuery();
			
								
			while(rs.next()){
				
				if (rs.getString(1) == null) {
					
					
					Pstmt1 = this.conexao
					   .prepareStatement("UPDATE Propriedade SET nome_proprietario_imovel_principal  = ? WHERE nome_proprietario_imovel_principal is null");
		                        
				
					
					Pstmt1.setString(1, "xxxxxxx");
				
					Pstmt1.execute();
				}
				
				//else {
				//	if (rs.getString(2) == null) {
				//		Pstmt1.execute("INSERT INTO Propriedade VALUES(' ')");
					}	
				//		 else {
				//			 if (rs.getString(3) == null) {
				//					Pstmt1.execute("INSERT INTO Municipios VALUES(' ')");
				//					
				//				}
				//		}
					
			
				//}
			//}
		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
		
		
	}
Você não entendeu.
public void verificaBranco() {

	PreparedStatement ps = null;
	
	try {
		ps = this.conexao.prepareStatement(
			"UPDATE Propriedade " +
			"SET nome_proprietario_imovel_principal = ? " +
			"WHERE nome_proprietario_imovel_principal IS null");

		ps.setString(1, "xxxxxxx");
		ps.executeUpdate();
		
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();

	} finally {
		if (ps != null)
			ps.close();
	}
}
Esse código já faz a procura e as alterações baseadas no critério. Ele não retorna resultados.

Quanto ao outro problema, qual é a linha 112?

E

a linha 112 é essa

Pstmt1.setString(1, Integer.toString(chave));

ou seja,

eu to jogando um valor que começa com 700000

e ele é continuo até terminar o loop,

o valor é int, eu o transformo em string para que ele entre no banco de dados como string. entendeu ?

B

Também não entendi o por quê do NullPointerException nesta linha. Tá mais fácil o erro estar em rs.getString(2).

Deixando isso de lado, outra pergunta: Qual o objetivo desse método? Li e reli e não entendi pra que serve a inserção na tabela.

E

É simples.

eu tenho um banco ODBC e nele está contido 4 tabelas. FRENTE, Produtor, Propriedade, Municipio.

esse método inserirDados serve para que, eu verifique algumas coisas.

1o: eu preciso pegar os nomes dos produtores da tabela produtor e jogar dentro da tabela FRENTE ( que está vazia), sendo que, eu preciso verificar na tabela propriedade se o produtor é o mesmo na tabela propriedade, num campo chamado nome_proprietario_imovel_principal, se o nome for o mesmo, tem um campo na tabela FRENTE, chamado ID_PROD, ou seja identificador do produtor. Então se ele for o mesmo da tabela propriedade, esse campo recebe o número 1, se ele não for, ele recebe o número 2.

por isso tem:

if (rs.getString(2).equals(produtor.getNomeProdutor())) {

	                        Pstmt1 = this.conexao
	                                .prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");

	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "1");
	                        Pstmt1.execute();

	                    }else {
	                    	 Pstmt1 = this.conexao
                             .prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");                                    
	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "2");
	                        Pstmt1.execute();
	                   
	                    }

eu criei o int chave, porque a chave primaria da tabela FRENTE tem que começar com 700.000. Entende ?

então depois que você me ajudou eu consegui. E assim ficou ó :

public void insereID(ConexaoDAO conexao){
		
		Produtor produtor = new Produtor();
		
		this.verificaBranco();
	 
	
		   try {
	            
	            PreparedStatement Pstmt1 = this.conexao
	                    .prepareStatement("SELECT nome_produtor,nome_proprietario_imovel_principal FROM Produtor prod,Propriedade prop WHERE prod.cod_produtor = prop.cod_produtor AND prod.cod_produtor < 12 ");

	            ResultSet rs = Pstmt1.executeQuery();
	           
	            int chave = 700000;
	            while (rs.next()) {

	            	System.out.println("chave: " + chave);
	            	
	                produtor.setNomeProdutor(rs.getString(1));

	                System.out.println(produtor.getNomeProdutor());
	                
	            //    String nome = rs.getString(2);
	                                               
	                    if (rs.getString(2).equals(produtor.getNomeProdutor())) {

	                        Pstmt1 = this.conexao
	                                .prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");

	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "1");
	                        Pstmt1.execute();

	                    }else {
	                    	 Pstmt1 = this.conexao
                             .prepareStatement("INSERT INTO FRENTE(CHAVE,ID_PRO) VALUES(?,?)");                                    
	                        Pstmt1.setString(1, Integer.toString(chave));
	                        Pstmt1.setString(2, "2");
	                        Pstmt1.execute();
	                   
	                    }
	 
	                chave++;
	               
	            }
	           
	            
	            // inserir nome dos produtores
	            
	            Pstmt1 = this.conexao
                .prepareStatement("INSERT INTO FRENTE(NOME_PROD) VALUES(?)"); 
	            Pstmt1.setString(1,produtor.getNomeProdutor());
	            Pstmt1.execute();
	            
	            
	            
	            Pstmt1.close();
	           
	            
	            

	        } catch (SQLException e) {

	            e.printStackTrace();
	        }
		
	}

Agradeço ae a suma importância do forum, e não menor participação de sua ajuda Bruno Laturner. Obrigado mesmo mano!

B

EuclidesFilizola:
É simples.

eu tenho um banco ODBC e nele está contido 4 tabelas. FRENTE, Produtor, Propriedade, Municipio.

esse método inserirDados serve para que, eu verifique algumas coisas.

1o: eu preciso pegar os nomes dos produtores da tabela produtor e jogar dentro da tabela FRENTE ( que está vazia), sendo que, eu preciso verificar na tabela propriedade se o produtor é o mesmo na tabela propriedade, num campo chamado nome_proprietario_imovel_principal, se o nome for o mesmo, tem um campo na tabela FRENTE, chamado ID_PROD, ou seja identificador do produtor. Então se ele for o mesmo da tabela propriedade, esse campo recebe o número 1, se ele não for, ele recebe o número 2.

Ok, estava perguntando isto por que você não está associando o produtor aos registros gerados.

Criado 18 de dezembro de 2008
Ultima resposta 18 de dez. de 2008
Respostas 11
Participantes 4