Pular para o conteúdo
  • Este tópico contém 7 respostas, 5 vozes e foi atualizado pela última vez 12 anos, 3 meses atrás por Vivaldo Neto.
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #104463
    Vivaldo Neto
    Participante

      Boa Noite galera,

      Estou aqui em um cliente fazendo manutenção no banco e me deparei com a seguinte situação…
      como fazer um select para selecionar as tabelas vazias e depois deleta-las

      Alguem tem uma ideia???

      Valeu

      #104467
      rman
      Participante

        @vivaldo

        Segue a ideia:


        DECLARE
        L_ROWS INTEGER;
        L_TABLE_NAME ALL_TABLES.TABLE_NAME%TYPE := NULL;
        BEGIN
        FOR TABLE_RECORD IN (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER =
        'DIGITE_AQUI_O_OWNER' ORDER BY TABLE_NAME) LOOP
        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || TABLE_RECORD.TABLE_NAME INTO
        L_ROWS;
        DBMS_OUTPUT.PUT_LINE(TABLE_RECORD.TABLE_NAME||', '||L_ROWS);
        END LOOP;
        END;

        #104489
        Vivaldo Neto
        Participante

          @rman

          Executei sua ideia mas me retornou somente “anonymous block completed”
          será que executou mas não existe tabela vazia??

          #104491
          rman
          Participante

            @vivaldo

            Utilize o sqlplus e execute antes:


            set serveroutput on

            #104493
            Claudeir Jose da Costa junior
            Participante

              Olá amigo, eu gosto de fazer as coisas do modo mais prático possível, sendo assim uma maneiro que eu fiz aqui em casa e deu certo, foi usando o SqlDeveloper para tratar o campo vazio, ou seja, eu 1º procurei qual tabela estaria com o campo vazio, depois fiz uma exportação dela em formato .SQL abri no próprio sqlDeveloper (Foi o único que entendeu que ‘ ‘ é um campo vazio entre aspas simples), mandei ele substituir ‘ ‘ por qualquer outra coisa tipo: ‘Vazio’ ou ‘VVV’ isso fica a sua escolha, ele substituiu e depois dropei a tabela e inseri os novos dados, possa ser que se a sua tabela for muito grande o Developer não tenha buffer para abrir o Sql. tenta e depois manda pra nós o resultado.

              Um abraço a todos.

              #104495
              paulogerva
              Participante

                Você pode coletar essa informação usando a coluna NUM_ROWS da view DBA_TABLES.

                select 'DROP TABLE ' || table_name || ';' from DBA_TABLES where owner='SCHEMA_OWNER' and num_rows=0;

                Porém antes é necessário atualizar os dados da view DBA_TABLES usando a função:

                begin
                dbms_stats.gather_schema_stats(ownname => 'SCHEMA_OWNER');
                end;

                Cuidado com a cláusula WHERE, pois se executar a query sem ela irá gerar um script que excluirá também tabelas do sistema.
                Também te aconselho a fazer um backup antes de efetuar esse procedimento.

                Abs.
                Paulo.

                #104531
                Victor Armbrust
                Mestre

                  paulogerva matou a pau essa! Eu faria exatamente assim.

                  Abs
                  Victor

                  #104557
                  Vivaldo Neto
                  Participante

                    Pessoal desculpe a demora pois os problemas resolveram atacar nesse final de mês, mas vamos lá..

                    @Claudeir_ti

                    Parceiro achei meio complicado esse método, mas nao posso me dar ao luxo de fazer o processo via SQLDeveloper, depois update e dropar na sequencia, mas toda ajuda é bem vinda.

                    A solução do paulogerva foi mais eficaz e rápida fiz, essa ja entrou para o diretório de Base de Conhecimento
                    valeu paulogerva

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.
                  plugins premium WordPress