Execução de .bat via PL/SQL

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
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Fala pessoal, como vão ?

Estou com um problema, que talvez seja simples de resolver.

Preciso executar uma rotina .bat (armazenado em um diretorio de rede) através de uma procedure. Isso porque tenho um processo no banco de dados e logo após tenho que executar esse .bat ...

alguém sabe como chamar um bat via uma procedure ?

Abraços.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Creio que dê pra fazer, criando uma classe Java dentro do BD Oracle e, nesta classe fazendo a chamada.
Vou ver se acho algum exemplo e posto aqui...

Abraço,
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Legal, Se você puder fico agradecidissimo.

Estava partindo pelo lado dos "Jobs externos", disponivel na versão 11 g .

Criar um job externo e chama-lo na procedure. Isso e possivel ? Lembrando que o servidor do Oracle é Linux e a maquina que esta o bath é Windows.
emer_rosa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Sáb, 28 Ago 2010 10:45 am
Localização: Torres-RS
Emerson E. Rosa

da sim, faço isso em varias procedures, é bem simples, cria o arquivo .bat da sequinte maneira:

Selecionar tudo

sqlplus useroracle/senhaoracle@instanciaoracle @script.sql
e coloca a procedure dentro do arquivo script.sql dentro do mesmo diretorio. Prontinho, so não esquece de terminar a procedure com / para funcionar no sqlplus.

Qualquer duvida manda aí, uso bastante arquivos .bat para executar procedures.
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Ola Emerson,

Acho que não é bem isso ! é meio que ao contrario do enviado.

Precido de uma procedure que chame bat em outro servidor. Ou seja, a automatização de dentro de minha sessão oracle executar um bat (que chama uma aplicação) em outro servidor.

Da forma que você enviou, esta chamando um arquivo .sql com comandos SQL para executação dentro da sua sessao no Oracle. Isso realmente é muito usado.

Obrigado pela ajuda.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brothers,

Fiz aqui um exemplo de chamada de classe java, de dentro do banco de dados Oracle.

Selecionar tudo

-- 1) Criação da Java Source no BD
-- Java Source no BD
create or replace and compile java source named gerenciabat as
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.io.FileNotFoundException;
import java.io.IOException;
-- Classe Java 
public class gerenciaBat {

     /**
     * Executa um .bat do SO.
     * @nomeArquivo - passar diretório e arquivo .BAT
     * @return String
     * @since 1.1
     */
    public static String executaArquivo(String nomeArquivo){
        
        String retorno = "";
        String ponto   = "";
        
        return "Arquivo: "+nomeArquivo;
  
    }
    
  };


-- 2) Criação da função que irá chamar a classe

CREATE OR REPLACE FUNCTION fun_gerencia_bat(pArquivo in varchar2)
   RETURN VARCHAR2 IS
   LANGUAGE JAVA
   NAME 'gerenciaBat.executaArquivo(java.lang.String) return String';
       
-- 3) Execução
select fun_gerencia_bat('teste.bat') from dual;                                   
É um exemplo bem simples, apenas da chamada do Java, sem executar o .bat ainda.
Essa parte do .bat precisa ser implementada.
Dei uma lida na internet e, pra se chamar um arquivo do SO, é utilizado o comando:

Selecionar tudo

Runtime.getRuntime().exec("..\bla\arquivo.bat")  
Passando-se o diretório e o arquivo.
Acho que com isso , consegue montar o que precisa.

Qualquer coisa, manda pra gente.
Abraço,
emer_rosa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Sáb, 28 Ago 2010 10:45 am
Localização: Torres-RS
Emerson E. Rosa

É verdade, entendi errado, isso não sei fazer não.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá gpereira,

Acho que por medida de segurança, o ORACLE não permite este tipo de operação (executar um arquivo em outro servidor que não seja o servidor de banco de dados).

Talvez você pudesse adotar uma destas alternativas.

A) No seu servidor WINDOWS você instala um banco de dados ORACLE (não poderia ser o XE, pois precisaria do JAVA instalado como componente). Ambas as bases (UNIX/WINDOWS) estariam ligadas por DBLINK. Assim, você executaria seu procedimento do UNIX e atualizaria alguma tabela de controle situada na base WINDOWS. Na base WINDOWS, haveria uma rotina que constantemente verificaria a execução da procedure remota. Quando detecta-se a execução da procedure, dispararia uma procedure armazenada Java na base ORACLE do Windows para executar este comando no SO do WINDOWS;

B) Em um forum OTN da Oracle me deparei com a idéia de um forista de desenvolver um programa SO do UNIX que se conectaria no WINDOWS via telnet e executaria o arquivo BAT. Esta solução talvez acarrete um risco de segurança, pois você precisaria manter no código o ip, usuário e senha de acesso. Independente disso, ao executar seu procedimento no banco, seria disparado um procedimento armazenado de banco em JAVA que executaria este programa Java no SO da máquina UNIX. Veja esta sugestão ao final da página deste forum de discussão: https://forums.oracle.com/forums/thread ... ID=2056768

Abraços e boa sorte,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

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