- Este tópico contém 10 respostas, 3 vozes e foi atualizado pela última vez 11 anos, 8 meses atrás por rman.
-
AutorPosts
-
4 de março de 2013 às 9:51 pm #105116João OtávioParticipante
Boa tarde pessoal,
Preciso criar uma rotina que execute um arquivo .bat diariamente, onde eu realizo um Sql*Loader.
Uma das saídas que eu vi nas minhas pesquisas, é a criação de uma classe Java e fazer a chamada por dentro dessa classe.
Gostaria de saber se esta é realmente a melhor saída para executar o arquivo, ou se alguém conhece algum outro método que poderia me ajudar.Obrigado,
João Otávio4 de março de 2013 às 9:57 pm #105117rmanParticipante@Joao21
O agendamento pode ser feito pelo agendador do Windows ou pelo crontab do Linux.
Não há necessidade de implementar em java é só chamar o .bat pelo agendador.
6 de março de 2013 às 4:20 pm #105132João OtávioParticipante[quote=”rman”:3pszekpg]@rman
Eu havia pensado nisso, porém meu sistema está sendo implementado em vários lugares, e o agendamento não será viável.
Tentei utilizar PHP, chamando a função exec(), mas (não sei como) sobrecarrega o servidor.
Queria testar algum meio de chamar o .bat via PL/SQL e fazer um agendamento pelo SQL Developer. Você saberia algum meio ?
Muito obrigado.
[/quote]
6 de março de 2013 às 9:37 pm #105137Fábio PradoParticipante@Joao21,
Não tenho nenhum script pronto para te ajudar, mas já fiz coisa parecida com “External Scheduler Jobs”. Pesquise por isso na net.
[]s
6 de março de 2013 às 10:19 pm #105143rmanParticipante@Joao21
Dependendo da situação pode ser utilizado EXTERNAL TABLE ao invés do Sql Loader, é necessário analisar o seu contexto e se é viável.
Mas fiquei curioso por que o agendamento não é viável…
Se você quiser manter o agendamento dentro do Oracle pode ser utilizado o pacote DBMS_JOB ou DBMS_SCHEDULER (dê preferencia a esse pacote) para isso. 😆
7 de março de 2013 às 9:22 pm #105148João OtávioParticipanteFoi exatamente isso que eu fiz @rman ! 😉
Meu JOB ficou do seguinte modo:
BEGIN
dbms_scheduler.create_job(
job_name => 'LOAD_ORIGEM',
job_type => 'EXECUTABLE',
job_action => 'D:oracleproduct10.2.0SQLLOADORIGEMGoLoad.bat',
start_date => systimestamp + interval '10' second,
repeat_interval => 'FREQ=DAILY',
enabled => TRUE,
auto_drop => FALSE,
comments => 'JOB LOAD DE ORIGEM');
END;
/
O problema agora é que, quando eu mando ele executar o JOB ele ACHA o arquivo .bat, mas não o executa. O código que eu estou fazendo pra rodar é o seguinte:
exec DBMS_SCHEDULER.run_job (job_name => 'LOAD_ORIGEM');
Esta chamada está correta mesmo ? E voce sabe o motivo dele nao estar executando meu arquivo .bat que eu especifiquei ?Abraço
7 de março de 2013 às 9:50 pm #105149rmanParticipante@Joao21
Qual o erro apresentado?
Tente executar da seguinte forma:
BEGIN
DBMS_SCHEDULER.run_job (job_name => 'LOAD_ORIGEM');
END;
7 de março de 2013 às 9:59 pm #105150João OtávioParticipante@rman
Executei e não me apresentou erro nenhum, mas também não executou o .bat, a unica coisa que ele me mostra é “bloco anônimo concluído”.
Se eu mudar o caminho do arquivo (D:oracleproduct10.2.0SQLLOADORIGEMGoLoad.bat) para um caminho inválido, ele me retorna um erro. Ou seja, o caminho que eu estou passando é válido.
Mais cedo ele estava me dando um erro na execução do DBMS_SCHEDULER, e eu resolvi startando o serviço no meu servidor, que até então estava offline. Não sei isso pode estar interferindo, mas acredito que não.
7 de março de 2013 às 10:28 pm #105152rmanParticipante@Joao21
Acabei de implementar um teste aqui, também cheguei no mesmo erro, segue a solução:
http://metaalex.blogspot.com.br/2009/12 … cript.html
Meu ambiente é linux, mas creio que seja a mesma ideia no Windows.
8 de março de 2013 às 6:45 pm #105157João OtávioParticipante@rman consegui fazer o JOB funcionar.
Esta solução não é valida no Windows, somente no Linux mesmo.
A única coisa a se verificar no Windows é se o serviço OracleJobScheduler está startado.No meu caso, estava dando problema é que mesmo com o .bat estando no mesmo diretório dos arquivos de SQL*Loader, eu precisava especificar o caminho completo na hora de chamar, exemplo:
Estava assim:
sqlldr ‘MMS/mms@cnhind’ control=’ControlFile.ctl’ log=’LoadResults.log’
E deveria estar assim:
sqlldr ‘MMS/mms@cnhind’ control=’D:oracleproduct10.2.0SQLLOADORIGEMControlFile.ctl’ log=’D:oracleproduct10.2.0SQLLOADORIGEMLoadResults.log’Agora estou criando uma Procedure para poder chamar o JOB todos os dias às 7 da manha. Estou fazendo deste modo:
create or replace
PROCEDURE LOA_ORIGEM AS
begin
sys.dbms_job.submit(job => :LOAD_ORIGEM,
what => 'begin LOAD_ORIGEM; end;',
next_date => to_date('09-03-2013 06:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'TRUNC(sysdate+1) + 1/24*7');
commit;
end;
Porém me retorna erro na parte: job => :LOAD_ORIGEM,
Erro(4,32): PLS-00049: variável de ligação ‘LOAD_ORIGEM’ inválidaO que pode estar gerando este erro ?
Obrigado, []s
8 de março de 2013 às 7:19 pm #105158rmanParticipante@Joao21
Ué… não entendi, você não vai mais utilizar o DBMS_SCHEDULER ?
Não é necessário criar um procedure pra fazer o agendamento, tanto o DBMS_SCHEDULER ou DBMS_JOB você configura o momento que vai ser disparado.
-
AutorPosts
- Você deve fazer login para responder a este tópico.