[Oracle] Alguem já viu isso?, mando deletar tudo(limpar) das tabelas e às vezes vai e outras não

6 respostas
J

Alguem já viu isso?, mando deletar tudo(limpar) das tabelas e às vezes vai e outras não…

Abaixo segue um exemplo… utilizando uma proc no banco e outro um delet normal…

package xxxx.service;

import java.sql.*;

public class LimpaTabelasTemporarias extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
              private java.sql.Connection conn;
    
             public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException
             {
                super.init(config);
                        
                try {
                  // Load Oracle driver
                  DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
                  
                  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xxxx:1521:xxx","xxx", "xxxx");                         

                  System.out.println("- Limpando as tabelas");

                  java.sql.CallableStatement cs = conn.prepareCall("{ CALL LIMPAR_TABELAS_TEMPORARIAS() }");
                 
                  cs.execute();

                  PreparedStatement ps = conn.prepareStatement("DELETE FROM CAMPANHAS_PRODUTOS_TEMP");
                  ps.execute();
                  ps.close();  
                  
                    
                  cs.close();
                  conn.close();
                  
                } catch(Exception e) {
                  e.printStackTrace();
                }
             }
}

6 Respostas

thiago.correa

O teu oracle está configurado para autocommit? Se não, você terá que dar commit na mão mesmo! Ou melhor, no código!

J

Fala ai Thiagão…

to dando commit na proc!!

CREATE OR REPLACE PROCEDURE LIMPAR_TABELAS_TEMPORARIAS IS
BEGIN
     /* Apagando registros temporarios*/
    
    DELETE FROM CAMPANHAS_PRODUTOS_TEMP;
    DELETE FROM COLAB_CUSTO_TS_TEMP;
    DELETE FROM JOB_SOLICITACAO_COPIADOS_TEMP;
    DELETE FROM TEMPLATE_ITEM_ATIV_JOB_TEMP;
    DELETE FROM TEMPLATE_ITENS_TEMP;
    DELETE FROM TEMPLATES_TEMP;
    DELETE FROM ESTIMATIVA_ORCAMENTOS_TEMP;
    DELETE FROM ESTIMATIVA_ITEM_COTACOES_TEMP;
    DELETE FROM ESTIMATIVA_ITENS_TEMP;
    DELETE FROM PEDIDO_COMPRA_IMPOSTOS_TEMP;
    DELETE FROM PERFIL_CONTEXTO_PRODUTOS_TEMP;
    DELETE FROM COLAB_RATEIO_TEMP;
    DELETE FROM ESTIMATIVA_PECAS_TEMP;
    DELETE FROM ESTIMATIVAS_TEMP;
    DELETE FROM EST_ITEM_ORCAMENTOS_TEMP;
    DELETE FROM EST_ITEM_ORC_ANEXOS_TEMP;
    DELETE FROM EST_ITEM_ORC_IMPOSTOS_TEMP;
    DELETE FROM EST_ITEM_ORC_VENCIMENTOS_TEMP;
    DELETE FROM EST_ITEM_ORC_VENC_TEMP;
    DELETE FROM EST_ITEM_TRG_TEMP;
    DELETE FROM EST_ITENS_TEMP_REC;
    DELETE FROM ESTIT_TEMP;
    DELETE FROM EST_PECAS_TEMP;
    DELETE FROM PEDIDO_COMPRA_VENCIMENTOS_TEMP;
    DELETE FROM PEDIDOS_COMPRA_TEMP;
    DELETE FROM PC_TEMP;
    DELETE FROM PCVE_TEMP;

    COMMIT;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       RAISE;
END LIMPAR_TABELAS_TEMPORARIAS;
/
J

Fala amigo…

Então to chamando na inicializaçao do tomcat!!, ou seja toda vez que derem um Restart/Start ele irá chamar esse servlet!.

Acredito que não influencia… influencia?

jmizutani:
Fala ai amigo!!
Vc ta chamando essa funcao como?
Pois vc configurou a funcao no metodo init do servlet. E o metodo init do servlet é executado somente uma vez no ciclo de vida do servlet.

Portanto, esse metodo será executado somente uma vez independente das request q vc fizer.

J

Por favor, explique melhor a frase

Isso quer dizer oque? Que às vezes exclui os registros de todas as tabelas e às vezes não, ou que às vezes a procedure executa e às vezes a procedure não executa??

E outra, esse trecho aqui:

<blockquote>PreparedStatement ps = conn.prepareStatement(“DELETE FROM CAMPANHAS_PRODUTOS_TEMP”);

ps.execute();

ps.close();  </blockquote>

Não vai excluir nunca a não ser que você coloque um commit conn.commit() explícito ou então setar a opção para conn.setAutocommit(true).

E mais outra, esse trecho da procedure:

<blockquote>    EXCEPTION

WHEN NO_DATA_FOUND THEN

NULL;

WHEN OTHERS THEN

RAISE;

</blockquote>

Não adianta testar no_data_found para o comando delete. Se você quer testar algum erro basta o when_others mas daí você terá que “repassar” esse erro para o Java.

No seu exemplo, caso dê erro ao tentar excluir dados de uma tabela que não exista, do jeito que você fez, vai ocorrer erro e a execução da procedure vai parar e todas as tabelas “abaixo” dessa que causou erro ainda terão dados. E não se esqueça de colocar um rollback ou commit tambén no when_others por que se ocorrer erro o Oracle executará um rollback implícito.

J

Fala ai amigo!!
Vc ta chamando essa funcao como?
Pois vc configurou a funcao no metodo init do servlet. E o metodo init do servlet é executado somente uma vez no ciclo de vida do servlet.

Portanto, esse metodo será executado somente uma vez independente das request q vc fizer.

J

Entao cara…se a intencao é limpar a base toda vez que a aplicacao é inicializada, eu faria um listener ServletContextListener.
Cria uma classe que implementa esta interface e vc vai ser obrigado a implementar dois metodos. Um deles é o ContextInitialized(ServletContextEvent). Ele é chamado quando a aplicacao é iniciada no servidor.
E declare esse listener no web.xml.

Nao faria isso no init, pois não é possivel determinar em que momento o servlet é inicializado (pode iniicar no deploy ou mesmo na primeira request)

Criado 17 de agosto de 2006
Ultima resposta 17 de ago. de 2006
Respostas 6
Participantes 4