Olá pessoal, tudo bem?
No post abaixo é mencionado como executar comandos dos sistemas operacionais via banco de dados Oracle, usando o DBMS_SCHEDULER.
Primeiro, ESTA FUNÇÃO TEM QUE PASSAR POR UMA AVALIAÇÃO DO DBA, POIS QUEBRA A INTEGRIDADE DE SEGURANÇA DO BANCO COM O SERVIDOR, isso porque a função quando executa o JOB, ela usa o Owner “Oracle” no servidor, e assim, todas as permissões que este usuário tiver no S.O, a função conseguirá executar o comando passado.
Segundo, é necessário dar os seguintes grants abaixo:
grant create job to "users"; grant create external job to "users"; grant execute on dbms_scheduler to "users";
A função abaixo cria um JOB do tipo EXECUTAVEL e em seguida executa tal JOB. No final apaga o JOB.
CREATE OR REPLACE FUNCTION F_EXEC_COMMAND(p_command in varchar2) RETURN VARCHAR2 IS /* Data/Criacao: 27/01/2010 Autor: Joao Elias de Aguiar - Manutencao Comercial Objetivo: Cria job no banco e executa comandos no Unix/Linux/Windows */ -- v_name_job varchar2(25) := 'FEXECOM' || dbms_session.unique_session_id; -- BEGIN -- dbms_scheduler.create_job(job_name => v_name_job ,job_type => 'EXECUTABLE' ,job_action => p_command ,start_date => sysdate ,repeat_interval => 'FREQ=DAILY' ,enabled => true ,auto_drop => false ,comments => 'Run command in OS'); -- dbms_scheduler.run_job (job_name => v_name_job); dbms_scheduler.drop_job (job_name => v_name_job); -- return('Comando executado!'); -- EXCEPTION When others then dbms_scheduler.drop_job (job_name => v_name_job); return('Erro ao executar comando: ' || sqlerrm); END F_EXEC_COMMAND; /
O nome do JOB é criado com a sessão concatenada no caso de várias execuções no mesmo momento.
Esta função pode ser executada em quaisquer sistemas operacionais. Basta que o comando enviado para execução seja próprio do S.O.
Bom, é isso aí pessoal.
Abs