Pular para o conteúdo
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #98550
    PhilipeSC
    Participante

      Bom Dia povo.

      então, preciso deletar da minha tabela (ela esta em partições por data e hora).

      fiz o seguinte bloco PLSQL e não funcionou, quero deletar da partição até que a partição tenha 5 mil registros, ela ta com 90500.

      segue o seguinte bloco se alguem puder ajudar.

      declare
      v_data_hora_inicio date;
      v_data_hora_fim date;
      CONT integer;
      begin
      v_data_hora_inicio := to_date(’01/01/2011 00:00:00′, ‘dd/mm/yyyy hh24:mi:ss’);
      v_data_hora_fim := to_date(’01/01/2011 00:59:59′, ‘dd/mm/yyyy hh24:mi:ss’);
      loop
      exit when v_data_hora_inicio>v_data_hora_fim;
      delete from ecdr_t_cdr_despesa
      where
      data_hora_inicio between v_data_hora_inicio and v_data_hora_inicio+(1/24-(1/86400))
      and
      indic_conciliado = ‘N’
      and
      rownum >5000;
      v_data_hora_inicio := v_data_hora_inicio + 1/24;
      CONT := SQL%ROWCOUNT;
      dbms_output.put_line(CONT);
      commit;
      end loop;
      end;

      o ROWNUM>5000 nao funciona, alguem tem uma solucao?

      #98560
      Ishii
      Participante

        Olá,

        O rownum é apenas uma coluna virtual para saber a quantidade de linhas, ela não representa as linhas diretamente. Como você usou um bloco de PL crie um contador (select count) das linhas e qdo o valor for igual a 5000 pare de deletar. Vai ficar meio lento, mas vai funcionar…

        []s Ishii

        #98563
        fsitja
        Participante

          Olá,

          Está um pouco estranho esse requisito, mas dá para fazer num comando só, sem PL/SQL.

          DELETE FROM ecdr_t_cdr_despesa
          WHERE ROWID IN
          (SELECT ROWID
          FROM (SELECT ROWID, row_number() over(ORDER BY 1) rn
          FROM ecdr_t_cdr_despesa
          WHERE data_hora_inicio BETWEEN &v_data_hora_inicio AND &v_data_hora_inicio + (1 / 24 - (1 / 86400))
          AND indic_conciliado = 'N')
          WHERE rn > 5000);

          A questão é… como você escolhe quais registros vão “sobreviver” e quais serão deletados? Não importa quem são os 5000? Não tem uma ordem de prioridade para deletar primeiro quem tem valor mais baixo na coluna X ou maior na coluna Y?

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