/*
Para automatizar tarefas (jobs) o Oracle possui dois recursos o DBMS_JOBS e DBMS_SCHEDULER.
O DBMS_SCHEDULER foi introduzido à partir da versão 10g, assim descidir que estava no hora de atulizar os artigos.
Embora este artigo foque em JOB ORACLE, perceba que abordei alguns metadados para confirmar se o objeto como
tabela, job e procedure existiam.
Step by Step...
1. criaremos uma tabela que vai armazenar :
O nome da tabela
Quantidade de registro.
E data da gravação do log
2. Criaremos uma PROCEDURE que sempre que for executada,
vai inserir um registro na tabela criada no item 1
3. Criaremos um job e habilitaremos sua execução
4. Mais importante LIMPANDO O LABORATORIO
OBS :
Para os iniciantes aconselho o usuo do Oracle SQL Developer, e só pegar o que esta escrito aqui
e executar no banco de teste.
Se gostou ajuda ai com um pix O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.. :-)
*/
-- > 1.
CREATE TABLE A_GRAVA_LOG (nome_tabela VARCHAR2(50), quant_reg number, dia DATE DEFAULT sysdate);
-- vamos gravar um registro por teste ( repare que para evitar problema o campo dia foi criado Date Default
INSERT INTO A_GRAVA_LOG (nome_tabela,quant_reg) VALUES ('A_GRAVA_LOG',10);
INSERT INTO A_GRAVA_LOG (nome_tabela,quant_reg) VALUES ('A_GRAVA_LOG',(SELECT COUNT(*) FROM A_GRAVA_LOG));
COMMIT;
-- veja o que acabamos de gravar
select * from A_GRAVA_LOG
-- > 2.
CREATE OR REPLACE PROCEDURE PRC_A_GRAVA_LOG IS
BEGIN
INSERT INTO A_GRAVA_LOG (nome_tabela,quant_reg) VALUES ('A_GRAVA_LOG',(SELECT COUNT(*) FROM A_GRAVA_LOG));
COMMIT;
END;
-- executando a procedure PRC_A_GRAVA_LOG
exec PRC_A_GRAVA_LOG;
-- Confirmando gravaçao
select * from A_GRAVA_LOG
-- > 3.
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
JOB_NAME => 'A_GRAVA_LOG_JOB',
JOB_TYPE => 'STORED_PROCEDURE',
JOB_ACTION => 'PRC_A_GRAVA_LOG',
START_DATE => SYSTIMESTAMP,
REPEAT_INTERVAL => 'FREQ=SECONDLY;INTERVAL=10',
ENABLED => FALSE,
COMMENTS => 'REPARE QUE ENABLED FOI CRIADO COM FALSE E
REPEAT_INTERVAL PODE SER FREQ=HOURLY
OU DIAS SEMANA ETC. CONSULTE NO GOOGLE'
);
END;
COMMIT WORK;
-- Verificando se o job foi criado.
select * from ALL_SCHEDULER_JOBS
select * from SYS.SCHEDULER$_JOB where PROGRAM_ACTION = 'PRC_A_GRAVA_LOG';
-- Verificando que o job não esta rodando
select * from A_GRAVA_LOG
/* Habilitar o JOB */
BEGIN
DBMS_SCHEDULER.ENABLE('A_GRAVA_LOG_JOB');
END;
-- Apos espera 10 segundo repare que o job agora esta rodando
select * from A_GRAVA_LOG
/* Desabilitando o JOB */
BEGIN
DBMS_SCHEDULER.DISABLE('A_GRAVA_LOG_JOB');
END;
-- Apos espera 10 segundo repare que o job agora esta rodando
select * from A_GRAVA_LOG
-- > 4.
/*
LIMPANDO O LABORATORIO
<<< NUNCA ESQUEÇA DISSO PROVEDORES DE SERVIÇOS DE NUVEM ADORAM OS QUE NÃO LIMPAM O LABORATORIO >>>
*/
/* Remover a JOB */
BEGIN
DBMS_SCHEDULER.DROP_JOB ('A_GRAVA_LOG_JOB');
END;
-- Verificando se o job foi APAGADO.
select * from ALL_SCHEDULER_JOBS
select * from SYS.SCHEDULER$_JOB where PROGRAM_ACTION = 'PRC_A_GRAVA_LOG';
/* Remover a Procedure */
-- VERIFICANDO SE A PROCEDURE EXISTE
SELECT * FROM all_procedures WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') AND OBJECT_NAME = 'PRC_A_GRAVA_LOG'
-- REMOVENDO A PROCEDURE
DROP PROCEDURE PRC_A_GRAVA_LOG
-- VERIFICANDO SE A PROCEDURE EXISTE
SELECT * FROM all_procedures WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') AND OBJECT_NAME = 'PRC_A_GRAVA_LOG'
-- VERIFICANDO SE A TABELA EXISTE
SELECT tablespace_name, table_name, owner FROM all_tables WHERE table_name= 'A_GRAVA_LOG';
-- REMOVENDO A TABELA
DROP TABLE A_GRAVA_LOG
-- VERIFICANDO SE A TABELA EXISTE
SELECT tablespace_name, table_name, owner FROM all_tables WHERE table_name= 'A_GRAVA_LOG';