Script para Oracle 10 e 11g

Anterior
Próximo
Feedback
Imprimir

Script para Oracle 10 e 11g

DECLARE

 

VAR_INDEX NUMBER;

 

BEGIN

 

   EXECUTE IMMEDIATE 'CREATE TABLE TmpOids(

     OID NUMBER CONSTRAINT PK_TmpOid PRIMARY KEY)';

 

   --Criar uma sequence para inserir registro sequenciais nas tabelas, pois o oracle não tem auto increment

   EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_LIMPACOLD

     MINVALUE 1

     MAXVALUE 999999

     NOCYCLE';

 

   EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_PARLIMCOLD

     MINVALUE 1

     MAXVALUE 999999

     NOCYCLE';

 

   -- Criar tabelas de logs

   EXECUTE IMMEDIATE 'CREATE TABLE TBLOGLIMPDOCSCOLD(

     IdLimpDocs NUMBER NOT NULL,

     HorIniLim DATE NOT NULL,

     DiaVidDoc NUMBER,

     TotExcTbCold NUMBER,

     TotExcTbColdEvt NUMBER,

     TotLoopDocumentos NUMBER,

     HorFimLim date,

     StatusAtual varchar2(100))';

 

   EXECUTE IMMEDIATE 'CREATE TABLE TBLOGMSGSCOLD(

     IdLogMSg NUMBER NOT NULL,

     IdLOGLIMPDOCS NUMBER NOT NULL,

     HorLog date NOT NULL,

     TxtMsg varchar2(200))';

 

   EXECUTE IMMEDIATE 'CREATE TABLE TBPARLIMCOLD(

     Id NUMBER CONSTRAINT PK_TbParlimColdId PRIMARY KEY,

     DiaVidDoc NUMBER NOT NULL,

     QtdRegLimLoo NUMBER NOT NULL,

     TemAtrLoo TIMESTAMP NOT NULL,

     TotDiaExc NUMBER NOT NULL,

     MsgLog NUMBER DEFAULT 0,

     ColdTbName varchar2(50) NOT NULL,

     ColdEvtTbName varchar2(50) NOT NULL,

     TpDoc varchar2(4) NOT NULL)';

END;

 

/

--===================================================================================================================

--===================================================================================================================

--=========================================PROCEDURE PARA GRAVAR LOG=================================================

create or replace

PROCEDURE ESCREVE_LOG(IdLimDocs NUMBER, TxtLog varchar2)AS

 

BEGIN

 INSERT INTO TBLOGMSGSCOLD (IDLOGMSG,IdLOGLIMPDOCS, HorLog, TxtMsg) values (SEQ_LIMPACOLD.NEXTVAL,IdLimDocs, sysdate, TxtLog);

 

 COMMIT;

 

 EXCEPTION

         WHEN NO_DATA_FOUND THEN

         dbms_output.put_line('DADOS NAO ENCONTRADOS NA TABELA DE PARAMETROS');  

END;

 

--===================================================================================================================

--===================================================================================================================

--=====================================PROCEDURE DE LIMPEZA DAS TABELAS==============================================

create or replace

PROCEDURE LIMPA_REGISTROS_COLD (configId IN NUMBER )

AS

 

 Var_DBName varchar2(50);

 Var_IdLimDocs number;

 Var_diasdevida        number;

 Var_totalregistro number;

 Var_qtdloop        number;

 Var_CountLoop number;

 Var_totalLimpezaLoop number;

 Var_tempodeatraso varchar2(50);

 Var_LogStr varchar(200);

 Var_InicioExec timestamp;

 Var_SQL VARCHAR2(2000);

 Var_RowCount number;

 Var_ColdTbName VARCHAR2(50);

 Var_ColdEvtTbName VARCHAR2(50);

 Var_TpDoc VARCHAR2(4);

 Var_DateEmiColumn VARCHAR2(50);

 Var_SqlCountOids VARCHAR(1000);

 Var_SqlDelete VARCHAR(1000);

 Var_MsgLog number;

 

BEGIN  

 

 SELECT SYS_CONTEXT('USERENV', 'INSTANCE_NAME') into Var_DBName FROM DUAL;

 

 BEGIN

   -- carrega as variáreis de acordo com a tabela TBPARLIMCOLD

 SELECT DiaVidDoc,QtdRegLimLoo,TemAtrLoo,ColdTbName,ColdEvtTbName,TpDoc, MsgLog

   INTO Var_diasdevida,Var_totalregistro,Var_tempodeatraso,Var_ColdTbName,Var_ColdEvtTbName,Var_TpDoc, Var_MsgLog

 FROM TBPARLIMCOLD

 WHERE Id = configId

 ORDER BY 1;  

 

 -- insere a linha de log para a execução

   INSERT INTO TBLOGLIMPDOCSCOLD (IdLimpDocs,HorIniLim,DiaVidDoc,TotExcTbCold,TotExcTbColdEvt,TotLoopDocumentos)

   values (SEQ_LIMPACOLD.NEXTVAL,sysdate,Var_diasdevida,0,0,0);  

   

   -- captura o id da execução na tabela TBPARLIMCOLD

   SELECT SEQ_LIMPACOLD.CURRVAL INTO Var_IdLimDocs FROM DUAL;

   

   EXCEPTION

     WHEN NO_DATA_FOUND THEN

       DBMS_OUTPUT.put_line('DADOS NAO ENCONTRADOS NA TABELA TBPARLIMCOLD');

   END;

 

 Var_InicioExec := to_timestamp(to_char(sysdate,'DD-MM-YY HH24:MI:SS'),'DD-MM-YY HH24:MI:SS');                

 

 --Elimina logs da última execução

 EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLOGMSGSCOLD';

 

 IF Var_MsgLog = 1 then

         ESCREVE_LOG(Var_IdLimDocs, 'Início da Limpeza');

 END IF;

 

 IF UPPER(Var_TpDoc) = 'NFE'

         then Var_DateEmiColumn := 'IDE_DEMI';

 ELSE

         Var_DateEmiColumn := 'IDE_DHEMI';

 END IF;

 

 Var_qtdloop := 0;

 -- início da captura de limites de informções

 

 IF Var_MsgLog = 1 then

         ESCREVE_LOG(Var_IdLimDocs, 'Verificado total de registros para limpezas');

 END IF;

 

 -- INICIO DA EXCLUSAO DE DOCUMENTOS EXPIRADOS

 Var_qtdloop := 0;

 UPDATE TBLOGLIMPDOCSCOLD SET StatusAtual = 'Inicio da limpeza de documentos expirados' where IdLimpDocs = Var_IdLimDocs;

 

 Var_totalLimpezaLoop := Var_totalregistro;

 

 Var_SqlCountOids := 'SELECT COUNT(oid) oidCount FROM '||Var_ColdTbName||' WHERE '||Var_DateEmiColumn||' < to_timestamp('''||to_char(Var_InicioExec,'DD-MM-YY HH24:MI:SS')||''',''DD-MM-YY HH24:MI:SS'') - '||to_char(Var_diasdevida)||' order by 1';

 EXECUTE IMMEDIATE Var_SqlCountOids INTO Var_CountLoop;

 

 IF Var_MsgLog = 1 then

         Var_LogStr := 'Total de documentos expirados encontrados: ' || to_char(Var_CountLoop);

         ESCREVE_LOG(Var_IdLimDocs, Var_LogStr);

 END IF;

 

 WHILE Var_CountLoop > 0 LOOP

       -- limpa tabelas para seleção dos registros

         IF Var_MsgLog = 1 then

                 ESCREVE_LOG(Var_IdLimDocs, 'Iniciado laço de limpeza da TbLogDocument');

         END IF;

         

       EXECUTE IMMEDIATE 'TRUNCATE TABLE TmpOids';

       

       INSERT INTO TBLOGMSGSCOLD (IDLOGMSG,IdLOGLIMPDOCS, HorLog, TxtMsg) values (SEQ_LIMPACOLD.NEXTVAL,Var_IdLimDocs, SYSDATE, 'Capturados valores mínimos');

     

       Var_qtdloop := Var_qtdloop + 1;

 

       UPDATE TBLOGLIMPDOCSCOLD SET StatusAtual = 'Carga dos documentos expirados'  where IdLimpDocs = VAR_IdLimDocs;

             

       Var_SQL := 'INSERT INTO TmpOids SELECT * FROM ( SELECT Oid FROM '||Var_ColdTbName||' WHERE '||Var_DateEmiColumn||' < to_timestamp('''||to_char(Var_InicioExec,'DD-MM-YY HH24:MI:SS')||''',''DD-MM-YY HH24:MI:SS'') - '||to_char(Var_diasdevida)||' order by 1) WHERE ROWNUM <='||to_char(Var_totalregistro);

       EXECUTE IMMEDIATE Var_SQL;

   

       SELECT count(*) into Var_totalLimpezaLoop from tmpoids;

       

         IF Var_MsgLog = 1 then

                 Var_LogStr := 'Inseriu registros na tmpLogsDocIds -> ' || to_char(Var_totalLimpezaLoop);

                 ESCREVE_LOG(Var_IdLimDocs, Var_LogStr);

       END IF;

         

       IF Var_totalLimpezaLoop = 0 then

                 IF Var_MsgLog = 1 then

                         ESCREVE_LOG(Var_IdLimDocs,'Encerrada a limpeza de documentos normais. Não existem documentos expirados no período de tempo especificado');

                 END IF;

                 

                 EXIT;

       END IF;

       

       /*

       INICIO DAS EXCLUSÕES

       */

       -- remove os registros de eventos que estão vinculados aos tmpLogsDocIds que serão removidos

       --DELETE FROM TbEvent WHERE LogDocId IN (SELECT LogDocId FROM tmpLogsDocIds);

       Var_SqlDelete := 'DELETE FROM '||Var_ColdEvtTbName||' WHERE OID IN (SELECT OID FROM TMPOIDS)' ;

       execute immediate Var_SqlDelete;

       Var_RowCount := SQL%ROWCOUNT;

       UPDATE TBLOGLIMPDOCSCOLD SET TotExcTbColdEvt = TotExcTbColdEvt + Var_RowCount WHERE IdLimpDocs = Var_IdLimDocs;

       IF Var_MsgLog = 1 then

                 ESCREVE_LOG(Var_IdLimDocs, 'Deletou da tablea de eventos');

         END IF;

       

       Var_SqlDelete := 'DELETE FROM '||Var_ColdTbName||' WHERE OID IN (SELECT OID FROM TMPOIDS)';

       execute immediate Var_SqlDelete;

       Var_RowCount := SQL%ROWCOUNT;

       UPDATE TBLOGLIMPDOCSCOLD SET TotExcTbCold = TotExcTbCold + Var_RowCount WHERE IdLimpDocs = Var_IdLimDocs;

       

         IF Var_MsgLog = 1 then

                 ESCREVE_LOG(Var_IdLimDocs, 'Deletou da tabela cold');

         END IF;

         

       EXECUTE IMMEDIATE Var_SqlCountOids INTO Var_CountLoop;

       --WAITFOR DELAY @tempodeatraso

 END LOOP;

 

 EXECUTE IMMEDIATE 'TRUNCATE TABLE TmpOids';

 UPDATE TBLOGLIMPDOCSCOLD SET TotLoopDocumentos = Var_qtdloop where IdLimpDocs = Var_IdLimDocs;

 --FINAL DA EXCLUSAO DE DOCUMENTOS EXPIRADOS

 

 

 UPDATE TBLOGLIMPDOCSCOLD SET HorFimLim = sysdate, StatusAtual = 'Limpeza Finalizada' where IdLimpDocs = Var_IdLimDocs;

 

 IF Var_MsgLog = 1 then

         ESCREVE_LOG(Var_IdLimDocs, 'Finalizou Limpeza');

 END IF;

 

END LIMPA_REGISTROS_COLD;

 

 

Script para download Oracle 10 e 11g.