Pular para o conteúdo
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #105116
    Avatar de João OtávioJoão Otávio
    Participante

      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ávio

      #105117
      Avatar de rmanrman
      Participante

        @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.

        #105132
        Avatar de João OtávioJoão Otávio
        Participante

          [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]

          #105137
          Avatar de Fábio PradoFábio Prado
          Participante

            @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

            #105143
            Avatar de rmanrman
            Participante

              @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. 😆

              #105148
              Avatar de João OtávioJoão Otávio
              Participante

                Foi 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

                #105149
                Avatar de rmanrman
                Participante

                  @Joao21

                  Qual o erro apresentado?

                  Tente executar da seguinte forma:


                  BEGIN
                  DBMS_SCHEDULER.run_job (job_name => 'LOAD_ORIGEM');
                  END;

                  #105150
                  Avatar de João OtávioJoão Otávio
                  Participante

                    @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.

                    #105152
                    Avatar de rmanrman
                    Participante

                      @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.

                      #105157
                      Avatar de João OtávioJoão Otávio
                      Participante

                        @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álida

                        O que pode estar gerando este erro ?

                        Obrigado, []s

                        #105158
                        Avatar de rmanrman
                        Participante

                          @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.

                        Visualizando 11 posts - 1 até 11 (de 11 do total)
                        • Você deve fazer login para responder a este tópico.
                        plugins premium WordPress