SQL Select e Delete na mesma query

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

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

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

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

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