Deletar registros de tabelas particionadas...Alguém posso me ajudar?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
KATIA DIAS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 16 Mar 2006 8:48 pm
Localização: são PAULO

Pessoal, possuo dois script´s que executo a cada 30 dias manualmente para limpeza "COD_COMMODITY", sendo um menor que 90 e 120 dias. . Agora vou automatizar e será executada por "SCHEDULER" ... Lembrando que são milhões de registros a ser deletados. Quero desenvolver tudo em uma proceddure, e preciso que seja primeiramente executada a 120 dias e posteriormente 90 dias. Alguém tem alguma idéia que possa me ajudar, como deixar essa procedure dinâmica? Segue exemplo:

--- SCRIPT 1

Selecionar tudo

DECLARE
  CURSOR DEL_PROD IS
                SELECT DISTINCT COD_COMMODITY FROM PRODUTOS P
                  JOIN PRODUTO_PRICE PR
                  ON P.COD_COMMODITY = PR.COD_COMMODITY
                WHERE P.DT_PROCESSO < TRUNC(SYSDATE) - 120;
  BEGIN
                FOR del IN cursor_del_prod LOOP
                     EXECUTE IMMEDIATE 'ALTER TABLE PRODUTOS_PRICE DROP PARTITION FOR (' || del.COD_COMMODITY|| ')' ;	
                END LOOP;
END;


--- SCRIPT 2

Selecionar tudo

DECLARE
  CURSOR DEL_PROD IS
                SELECT DISTINCT COD_COMMODITY FROM PRODUTOS P
                  JOIN PRODUTO_PART PRT
                  ON P.COD_COMMODITY = PRT.COD_COMMODITY
                WHERE P.DT_PROCESSO < TRUNC(SYSDATE) - 90;
  BEGIN
                FOR del_part IN cursor_del_prod LOOP
                    EXECUTE IMMEDIATE 'ALTER TABLE PRODUTO_PART DROP PARTITION FOR (' || del_part.COD_COMMODITY|| ')' ;	
                END LOOP;
END;

Muito obrigada!
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Boa tarde,

Sei que o post é antigo, mas a título de informação e caso possa servir de ajuda, fica como consulta.

Mas há algum tempo eu precisei criar uma rotina de expurgo automatizada para uma tabela particionada com alta volumetria e basicamente eu fiz o seguinte:

Criei um CURSOR para fazer a leitura de todas as partições da tabela:

Selecionar tudo


SELECT TO_DATE(TRIM( SUBSTR( TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()),INSTR(TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()), '(')+3
                                     ,INSTR(TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()), ' ')
                                    )
                            ),'RRRR-MM-DD') AS DATE_HIGH_VALUE
               ,DTP.TABLE_OWNER             AS TABLE_OWNER
               ,DTP.TABLE_NAME              AS TABLE_NAME
               ,DTP.PARTITION_NAME          AS PARTITION_NAME
           FROM ALL_TAB_PARTITIONS DTP
          WHERE DTP.TABLE_OWNER = C_OWNER
            AND DTP.TABLE_NAME  = C_TABLE_NAME_CP
            AND TO_DATE(TRIM( SUBSTR( TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()),INSTR(TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()), '(')+3
                                     ,INSTR(TO_CHAR(SYS_DBURIGEN(DTP.TABLE_OWNER, PARTITION_NAME, DTP.HIGH_VALUE,'text()').GETCLOB()), ' ')
                                    )
                            ),'RRRR-MM-DD') < TRUNC(SYSDATE) - P_CUR_PERIODO
                            
Onde, o parâmetro: P_CUR_PERIODO, é utilizado para determinar o período que deverá ser excluído.

Depois eu montei um procedimento, onde faço a exclusão das partições da seguinte forma:

Selecionar tudo


OPEN C_DATE_HIGH_VALUE(L_QT_PARAM);
LOOP 
  FETCH C_DATE_HIGH_VALUE INTO R_DATE_HIGH_VALUE;
  
	BEGIN
	  --
	  EXECUTE IMMEDIATE 'ALTER TABLE ' || REC_ALL_TAB_PARTITIONS.TP_TABLE_OWNER || '.' || REC_ALL_TAB_PARTITIONS.TP_TABLE_NAME ||
						' DROP PARTITION ' || REC_ALL_TAB_PARTITIONS.TP_PARTITION_NAME;
	  --
	EXCEPTION
	   WHEN OTHERS THEN
		 BEGIN
		   --
		   L_LINHA     := $$PLSQL_LINE;
		   L_MSG_ERROR := SQLERRM;
			
		   RAISE E_RAISE_DROP;
		   --
		 END;
	END;

  EXIT WHEN C_DATE_HIGH_VALUE%NOTFOUND;
END LOOP;

Observação: Os procedimento listados acima, estão resumidos, porém, você pode adaptar conforme a sua necessidade.

No meu caso eu tenho uma tabela de parametrização, a onde eu defino o número de dias que deverão ser excluídos no parâmetro: L_QT_PARAM.

Att.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante