Procedure para envio de email

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
tatellis
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 19 Ago 2014 9:14 am

Boa tarde a todos

Sou novo em programação e preciso de uma ajuda com uma procedure para envio de email

Tenho uma tabela aonde são gravadas as informações das alterações realizados no ponto e preciso que esses dados sejam enviados para os seus determinados chefes, estou anexando o código quem puder me ajudar eu agradeço.

Att,

Tiago

Selecionar tudo

create or replace 
PROCEDURE  PRC_PONTO_PORTAL IS

--====================================================================================================================================
-- Procedure para informar as marcações do ponto inseridas no portal
-- Versão: 1.0
--====================================================================================================================================

v_handle                     UTL_FILE.file_type;
v_tab_anexo                  SendMailJPkg.ATTACHMENTS_LIST := SendMailJPkg.ATTACHMENTS_LIST(NULL);
v_cabecalho                  VARCHAR2(2000) := '';
v_linha                      VARCHAR2(2000) := '';
v_detalhe                    varchar2(2000) := '';
v_email                      VARCHAR2(500)  := null;
v_emailCC                    VARCHAR2(500)  := null;
v_dir_gravacao               VARCHAR2(60)   := '';
v_dt_inicio                  DATE           := trunc(sysdate-1);
v_dt_fim                     DATE           := trunc(sysdate);
v_msg_subject                VARCHAR2(200)  := 'Aprovação de Batidas Inseridas manualmente - Portal de RH';
v_nom_arquivo                VARCHAR2(200)  := 'Batidas_Inseridas.csv';
v_contador                   NUMBER         := 0;
v_cdEmpresa                  NUMBER(3):= 0;
v_nmEmpresa                  VARCHAR2(100) := '';
v_nomSAP                     VARCHAR2(2000) := '';
v_desAtividade               VARCHAR2(2000) := '';
v_desObservacao              VARCHAR2(2000) := '';
v_email                      VARCHAR2(500)  := null;
v_email_coordenador          VARCHAR2(500)  := null;




-- Verifica se existe marcações de ponto inseridas no portal 

CURSOR BATIDAS_PONTO IS
 select a.codcoligada coligada, b.codfilial filial, a.chapa chapa, b.nome nome, a.data datamarcacao, b.codsecao secao, c.descricao secaodesc,to_char(trunc((a.batida / 60),0),'fm00') || ':' || to_char((a.batida - (trunc(a.batida / 60) * 60)),'fm00')batida,
 decode(a.natureza,1,'Saída',5,'Saída',0,'Entrada',4,'Entrada') natureza ,
 (select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,13))Gerente,
 (select email from rm.ppessoa where codigo = (select codpessoa from rm.pfunc where chapa=(select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,13))))email_gerente,
 (select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,18))Coordenador,
  (select email from rm.ppessoa where codigo = (select codpessoa from rm.pfunc where chapa=(select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,18))))email_coordenador,
 (select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,21))Supervisor,
  (select email from rm.ppessoa where codigo = (select codpessoa from rm.pfunc where chapa=(select a.chapasubst from rm.psubstchefe a where a.codsecao=substr(b.codsecao,1,21))))email_supervisor,
  a.reccreatedby usuario_inclusao
  from rm.abatfun a, rm.pfunc b, rm.psecao c
    where a.codcoligada=b.codcoligada and
          b.codcoligada=c.codcoligada and
          b.codsecao=c.codigo and
          a.chapa=b.chapa and
          a.status='T' and
          a.datainsercao=to_char(sysdate,'dd/mm/yy');
          

BEGIN
   -- Recupera diretorio de gravação;
   BEGIN
     select TRIM(directory_path) || '/'
       into v_dir_gravacao
       from all_directories
      where directory_name = 'DIR_FILTRO_EXP';
   EXCEPTION WHEN NO_DATA_FOUND THEN
      RAISE_APPLICATION_ERROR(-20020, 'Erro ao selecionar diretório de gravação ! '  ||SQLERRM);
   END;


   v_handle  := UTL_FILE.fopen ('DIR_FILTRO_EXP', v_nom_arquivo, 'W');-- Abertura de Arquivo

   v_linha := 'COLIGADA;FILIAL;CHAPA;NOME;DATA_MARCACAO;CODIGO_SECAO;DESCRICAO;BATIDAS;TIPO_BATIDA';
   
   UTL_FILE.put_line (v_handle, v_linha);

        
  BEGIN

  
  FOR I IN BATIDAS_PONTO
     
            
     LOOP
                 
  --  if v_email_coordenador = i.email_coordenador then
      if i.chapa > 0 then
       v_linha  := ( i.coligada        || ';' ||
                     i.filial          || ';' ||
                     I.chapa           || ';' ||
                     I.nome            || ';' ||
                     I.datamarcacao    || ';' ||
                     I.secao           || ';' ||
                     i.secaodesc       || ';' ||
                     i.batida          || ';' ||
                     i.natureza        );
 
       UTL_FILE.put_line (v_handle, v_linha);
       v_linha := null;
      
       v_contador := v_contador + 1;
              
     END IF;
     END LOOP;
  
  END;

   UTL_FILE.fclose (v_handle);


   -- Envia email;
     
   IF v_contador > 0 then

   v_tab_anexo.extend;
   v_tab_anexo(1) := v_dir_gravacao || TRIM(v_nom_arquivo);

   begin

   SendMailJPkg.send_mail (p_msg_from    => 'webm@teste.com.br',
                           p_msg_to      => 'teste@teste.com.br',
                           p_msg_subject => 'Aprovação de Marcações de Ponto',
                           p_msg_text    => 'Segue em anexo arquivo referente as Marcações de Ponto inseridas via Portal de RH.' ||  chr(10) ||chr(10) ||
                                            'Favor verificar e Aprovar as Marcações de Ponto.' || chr(10) ||chr(10) ||
                                            'Este email foi gerado automaticamente pelo sistema, portanto não o responda.',
                           p_msg_attach  => v_tab_anexo);

--   UTL_FILE.fremove ('DIR_FILTRO_ANCORA_EXP', v_nom_arquivo);

     EXCEPTION WHEN NO_DATA_FOUND THEN
      RAISE_APPLICATION_ERROR(-20020, 'Erro ao enviar email! '  ||SQLERRM);
   end;

   END IF;
   v_contador := 0;
   v_email_coordenador := null;

EXCEPTION WHEN others THEN
      RAISE_APPLICATION_ERROR(-20020, 'Erro na execução da procedure PRC_PONTO_PORTAL: '  ||SQLERRM);
END;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

E está dando algum erro ? O que exatamente está com problema ?
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

Tatellis,


Se você estiver com problemas na geração do arquivo CSV, sugiro usar a função que disponibilizo no artigo http://www.fabioprado.net/2014/07/geran ... plsql.html.

[]s
tatellis
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 19 Ago 2014 9:14 am

Bom dia

Então erro não está dando não, o que acontece é o seguinte eu faço o select busco as informações na tabela, nessa tabela tenho informações a serem enviadas para o email x, y e z e minha procedure não estou sabendo tratar como enviar os dados do gestor email x, depois enviar somente os dados do gestor email y e z.

Atualmente a procedure está enviando para um único email fixo.

Obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Parece que o problema é que o envio de email está fora do cursor.
Se você quer mandar individualmente um email pra cada linha retornada da query, precisa colocar o envio dentro do LOOP também.

:roll:
tatellis
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 19 Ago 2014 9:14 am

Então na verdade não é enviar um email linha por linha extraída e sim pegar todos os funcionários que correspondem ao chefe x e dispara o email para ele, entra no loop de novo pega os outros funcionários do chefe y e envia o email e ai sucessivamente.

Att,

Tiago
Responder
  • Informação
  • Quem está online

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