SQL Select e Delete na mesma query

3 respostas
M

galera, estou otimizando as consultas no meu banco de dados e preciso fazer o seguinte:

1 - fazer um select para pegar o valor de uma tupla da tabela
2 - armazenar o valor desta tupla em uma variavel
3 - apagar o valor desta tupla logo apos ler o seu valor

o select e o delete devem ser executados na mesma query, mas eu preciso do valor retornado pelo select, alguem me da uma dica ? exemplo ?

grato

3 Respostas

H

Sé uma otimização, coloque a query antiga aí para dar uma idéia do que fazer.

M

acho que nao usei o termo correto ao dizer otimização, vou explicar melhor

1 - estou usando a base de dados H2
2 - as consultas sql sao extremamente simples, tipo SELECT * FROM TABELA LIMIT 1

vou mostrar o desenho do banco, teno as tabelas

tabela A tabela B tabela C

  • eu preciso ler um registro da tabela A e deletar esse registro
  • depois eu devi pegar esse registro lido e inserir na tabela B
  • depois de processar o registro que foi lido da tabela A, inserido na tabela B, eu devo retirar da tabela B e colocar o dado na tabela C

essa transição entre as tabelas A-B eu queria q que fosse feito na mesma consulta, pois a aplicação e multi thread e estou tendo que fazer muitas conexoes com o banco de dados

o ideal seria fazer um DELETE FROM TABELA WHERE (SELECT * FROM TABELA LIMIT 1)

mas eu teria que saber o valor q foi deletado, no SQl Server tem a clausula OUTPUT que permite isso mas no H2 nao tem, por isso to precisando de ajuda pois que quero realizar estas operações sem tem q acessar o banco pra fazer um select, depois pra fazer um insert e depois um delete, ao inves de 3 conexoes queria fazer tudo em uma so

M

tentei fazer assim, seria uma boa solução ?

public static synchronized String tupla() {
		
		String resultado = null;
		 
		// monta sql
		StringBuilder sql1 = new StringBuilder().
				                 append("SELECT * FROM ").
				                 append(ConstantesDoBanco.TABELA_A.valorS()).
				                 append(" LIMIT 1");
		
		StringBuilder sql2 = new StringBuilder().
			                     append("DELETE TOP 1 FROM ").
			                     append(ConstantesDoBanco.TABELA_A.valorS()).
		 	                     append(" WHERE ").
			                     append(ConstantesDoBanco.CAMPO_A.valorS()).
			                     append(" = ?");
	
		StringBuilder sql3 =  new StringBuilder().
                                  append("INSERT INTO ").
                                  append(ConstantesDoBanco.TABELA_B.valorS()).
                                  append(" VALUES (?)");
	
		try (Connection CONEXAO = Conecta.pegaConexao(); 
				
			 PreparedStatement stm1 = CONEXAO.prepareStatement(sql1.toString(),
					                                           ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                                               ResultSet.CONCUR_READ_ONLY);
			 PreparedStatement stm2 = CONEXAO.prepareStatement(sql2.toString(),
                                                               ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                                               ResultSet.CONCUR_READ_ONLY);		
			 PreparedStatement stm3 = CONEXAO.prepareStatement(sql3.toString(),
                                                               ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                                               ResultSet.CONCUR_READ_ONLY);) {
			
			try (ResultSet rs = stm1.executeQuery();) {

				// obtem o resultado do comando
				while (rs.next())
					resultado = rs.getString(1);
				
			}// try
			
			stm2.setString(1, resultado);
			stm2.executeUpdate();
			
			stm3.setString(1, resultado);
			stm3.executeUpdate();
					
		} catch (SQLException e) {
			
			ExibeMensagem.naSaidaPadrao("ERRO ao fazer LEITURA de REGISTROS: " + e.getMessage());
			
		}// catch

		return resultado;

	}// end of tupla
Criado 10 de outubro de 2015
Ultima resposta 17 de out. de 2015
Respostas 3
Participantes 2