Jobs + Procedure

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
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Boa Tarde a todos,
So novo no Forum e no Oracle Tambem, gostaria de um exemplo ou uma opinião de como fazer um procedimento que estou necessitando fazer.

Necessito excluir os registros de uma tabela, com a data de 48 horas para traz, ex: (19/07/2010 - 2) = 17/07/2010, e fazer um jobs, que rode todos os dias as 23:55, excluindo os referente ao exemplo assim..

Imagino eu que devo fazer um procedure, onde gera a exclusão dos registros, e so chamar ela no jobs para executar, mas estive vendo varios artigos e ajuda na internet e não achei nada satisfatorio...

Por ser novo no oracle, gostaria de um apoio da comunidade ai para que eu possa resolver o meu problema, agradeço desde já pela atenção de todos e muito obrigado, fico no aguardo de um retorno.

att
Michel
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Bom dia alemaocar,
Segue um exemplo abaixo de como acho que ficaria seu problema:

Selecionar tudo

--PROCEDURE
create or replace procedure prc_exclui_registros as
begin
    delete from tabela_teste
    where to_date(data_registro, 'dd/mm/rrrr') = 
              to_date(sysdate, 'dd/mm/rrrr') - 2;
end;

--JOB
begin
    dbms_job.submit(:job,
    what => 'begin prc_exclui_registros; end;', 
    next_date => to_date('20/7/2010 23:55:00, dd-mm-yyyy hh24:mi:ss'),
    interval=> 'sysdate + 1');
commit;
end;
São apenas exemplos, não testei nem nada, mas espero que possa ajuda-lo.
falou!!!!
Avatar do usuário
Bogos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 06 Jul 2010 8:58 am
Localização: Americana / SP
Contato:
Ivens Bógos
Analista Desenvolvedor Oracle

Só retificando a resposta do diego

Selecionar tudo

--PROCEDURE 
create or replace procedure prc_exclui_registros as 
begin 
    delete from tabela_teste 
    where trunc(data_registro) = 
               trunc(sysdate - 2); 
    commit;
end; 

--JOB 
begin 
    dbms_job.submit(:job, 
    what => 'begin prc_exclui_registros; end;', 
    next_date => to_char(trunc(sysdate)||' 23:55', 'DD/MM/YYYY HH24:MI') 
    interval=> 'sysdate + 2'); 
end; 
:D
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

:)
Opa Boa Tarde Bogos,
Realmente, achei alguns erros na criação das procedure e do jobs que o Diego passo, vo testar o que você ratificou e qualquer duvida ou novidade posto as mesmas para deixar registrado ok,
agradeço desde já pela atenção e muito obrigado..

Att,
Michel
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Criação da Procedure sem problemas, gerada e rodando certinho, mas na hora de gerar o jobs ele da erro, provavelmente eu estou gerando o jobs errado, gostaria de um apoio de vocês, o jobs que estou tentando fazer é o seguinte

Selecionar tudo

DECLARE
  JOB_ID NUMBER;
begin 
    mês_INDUSTRIA.dbms_job.submit(:job, 
    what => 'begin PRC_EXCLUIR_REGISTROS; end;', 
    next_date => to_char(trunc(sysdate) ||' 17:00', 'DD/MM/YYYY HH24:MI') 
    interval=> 'sysdate + 2'); 
end;
'BEGIN
  /* Type job body code here */
  RETURN;
END;'

);
END;
/
o erro que ocorre é o seguinte:

Selecionar tudo

ORA-06550: linha 7, coluna 5:
PLS-00103: Encontrado o símbolo "INTERVAL" quando um dos seguintes símbolos era esperado:

   . ( ) , * % & = - + < / > at in is mod remainder not rem
   <um expoente (**)> <> or != or ~= >= <= <> and or like LIKE2_
   LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
O símbolo "(" foi substituído por "INTERVAL" para continuar.
ORA-06550: linha 7, coluna 30:
PLS-00103: Encontrado o símbolo ";" quando um dos seguintes símbolos era esperado:

   . ( ) , * % & = - + < / > at in is mod remainder not rem
   <um expoente (**)> <> or != or ~= >= <= <> and or like LIKE2_
   LIKE4_ LIKEC_ between || m
provavelmente é eu que não estou sabendo como gerar o jobs, fico no aguardo de um retorno...

obrigado pela atenção de todos

att
Michel
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Bom dia a todos,
Bom, a procedure que passei como exemplo não possui erros, logico que o nome da tabela tabela_teste e o nome do campo data_registro são ficticios, porém não está errada sua estrutura.
E quanto a job, ela também não está errada, o que está faltando é um declare e uma variavel, ficaria assim:

Selecionar tudo

declare
    v_job number;
begin
    dbms_job.submit(v_job,
    what => 'begin prc_exclui_registros; end;',
    next_date => to_date('20/7/2010 23:55:00, dd-mm-yyyy hh24:mi:ss'),
    interval=> 'sysdate + 1');
commit;
end; 
Os exemplos do bogos, na minha opinião, ele melhorou um detalhe do que te passei, ao invés de usar to_date, ele está usando trunc nas datas, o que acredito que realmente seja melhor, bom, os erros da dele são que na linha de cima do INTERVAL falta uma vírgula, e o sysdate + 2 deveria ser sysdate + 1 de acordo com o que você quer.
Segue abaixo o exemplo dele corrigido.

Selecionar tudo

declare
   v_job number;
begin
   dbms_job.submit(v_job,
   what => 'begin prc_exclui_registros; end;',
   next_date => to_char(trunc(sysdate)||' 23:55', 'DD/MM/YYYY HH24:MI'),
   interval=> 'sysdate + 1');
end;
falou!!!
Avatar do usuário
Bogos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 06 Jul 2010 8:58 am
Localização: Americana / SP
Contato:
Ivens Bógos
Analista Desenvolvedor Oracle

Ops! faltou vírgula, declare e o interval ficou incorreto mesmo :S
:lol:

Valeu diego!
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Bom Dia Diego, obrigado pelo retorno

Executamos o seguinte comando para gerar o jobs:

Selecionar tudo

declare 
   v_job number; 
begin 
   dbms_job.submit(v_job, 
   what => 'begin PRC_EXCLUIR_REGISTROS; end;', 
   next_date => to_char(trunc(sysdate) || ' 08:30', 'DD/MM/YYYY HH24:MI'), 
   interval=> 'sysdate + 1'); 
end;
/

Mas o Mesmo me retorna um erro no Oracle, mexemos, e modificamos o codigo mas mesmo assim continua ocorrendo o erro, o mesmo encontra-se abaixo:

Selecionar tudo

ORA-06502: PL/SQL: erro: erro de conversão de caractere em número numérico ou de valor
ORA-06512: em line 4
fico no retorno de um apoio,
e obrigado pela atenção

att
Michel
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Bom dia,
O problemas está na linha do next_date, substitua o to_char por to_date que da certo.
falou!!
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Opa Buenas Diego

Desculpe encomodalo novamente, fiz a modificação que você me oriento, mas ainda continua ocorrendo problemas

Selecionar tudo

ORA-06550: linha 1, coluna 99:
PLS-00201: o identificador 'PRC_EXCLUIR_REGISTROS' deve ser declarado
ORA-06550: linha 1, coluna 99:
PL/SQL: Statement ignored
ORA-06512: em "SYS.DBMS_JOB", line 79
ORA-06512: em "SYS.DBMS_JOB", line 136
ORA-06512: em line 4
Me diz uma coisa estou usando o Oracle Express 10G, lhe pergunto o seguinte, não teria nenhum problema em criar jobs ou algo parecido mesmo sendo express ne???

Fico no aguardo de um retorno

att
Michel
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Outro coisa Diego, o meu campo na tabela chamado Data, ele esta com o tipo Varchar(20), pois o que ocorre, é que esta tabela recebe informações de uma outra aplicação que existe no cliente, o que tivemos que fazer foi modificar de Date, para VarChar(20), porque o pessoal que precisava depositar as informações nesta tabela estava com problema de inserção por causa da Data, sera que não pode ser isto o problema que esta ocorrendo..

att
Michel
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Bom dia,
Segundo esse erro, sua procedure não foi criada.
Ou seja a PRC_EXCLUIR_REGISTROS é sua procedure, e ela não foi criada.
Verifica se você já criou a procedure, e se você criou ela com este nome mesmo PRC_EXCLUIR_REGISTROS
O fato de ser varchar seu campo acho que não interfere neste erro.

t+
Avatar do usuário
Bogos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 06 Jul 2010 8:58 am
Localização: Americana / SP
Contato:
Ivens Bógos
Analista Desenvolvedor Oracle

Bom dia,

alemaocar, você utilizou o exemplo do diego e esqueceu de alterar o nome da procedure que a job chama, no caso PRC_EXCLUIR_REGISTROS.
Verifica qual procedure você utiliza para o processo e altere sua job.

Abraços!
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Opa Boa Tarde Pessoal,

Obrigado pelo Ajuda, apos varias tentativas, acabei instalando o PL/SQL, aqui na minha maquina na empresa, e consegui colocar em pratica a procedure e o job tambem, detalhe, executando perfeitamente, daqui a pouco vo colocar o codigo no ar para deixar a solução para todos que necessitarem.

Mas so mais um detalhe, pessoal estou tentando executar o seguinte sql para visualizar a executação do job, mas esta me retornando o seguinte erro se o pessoal conseguir me ajudar novamente, ficaria grato..

Sql sexecutado para verificar a execução do Job:

Selecionar tudo

SELECT JOB, 
SUBSTR(WHAT,1,35), 
NEXT_DATE, 
NEXT_SEC, 
BROKEN 
FROM DBA_JOBS; 
Erro que me Retorna,

Selecionar tudo

- ORA-00942: a tabela ou viwe não existe
fico no aguardo de um retorno e obrigado pela atenção

att
Michel
alemaocar@hotmail.com
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Pelo erro, essa tabela não existe, tenta usar a tabela ALL_JOBS
t++
alemaocar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 19 Jul 2010 5:47 pm
Localização: Erechim-RS

Diego agradeço pela atenção td certo testa e funcionando, abaixo esta o codigo usado, se alguém alguém dia necessitar ele esta ai para ajuda

Procedure para exclusão de registros automatico, ele pega a data atual e diminui 48 horas para tras e deleta os registros referente a data.

Selecionar tudo

create or replace procedure prc_exclui_registro
is
begin
    delete from SAP_SB_ENTRADA
    where trunc(DATA) = trunc(sysdate - 2);
    commit;
end prc_exclui_registro;
job para disparo automatico da procedure

Selecionar tudo

begin
  sys.dbms_job.submit(job => :job,
                      what => 'begin
  prc_exclui_registro; 
end;',
                      next_date => to_date('23-07-2010 17:42:48', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate + 1');
  commit;
end;
/
Detalhe, não precisei criar no braço mas sim o proprio pl/sql tem um metodo mais facil e rapido mas o codigo para criação no braço é igual

sql para verificar a execução do job

Selecionar tudo

SELECT JOB, 
SUBSTR(WHAT,1,35), 
NEXT_DATE, 
NEXT_SEC, 
BROKEN 
FROM ALL_JOBS; 
agradeço a atenção pela ajuda e muito obrigado

att
Michel
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 24 visitantes