[RESOLVIDO] Problema com Proc enviando e-mail

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
WilsonJunior
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 10 Mar 2014 12:05 am
Localização: Araraquara

Pessoal, gostaria de contar com a ajuda de vocês .. estou com pequeno impasse para resolver.
Na verdade o problema é simples, mas infelizmente não consegui resolver do jeito que quero.

No final do expediente, o analista de crédito daqui da empresa precisa receber uma lista do clientes agendados para o dia seguinte, para que ele analise e libere ou não o crédito para o cliente efetuar uma compra a prazo.

Eu fiz a procedure abaixo para ser executada através do job e até aí tubo bem, MAS, ao enviar e-mail para o analista, a proc envia um e-mail para cada registro que o select retorna. Eu preciso que seja enviado um e-mail só, com todos os clientes agendados, e não consegui.

Alguém poderia me dar uma força para solucionar esse problema? rsrs

Agradeço desde já!
Wilson.

Selecionar tudo

CREATE OR REPLACE PROCEDURE WJOB_AGENDADOS AS
  -- PROC PARA ENVIAR E-MAIL DOS AGENDAMENTOS DO DIA POSTERIOR
  V_EMAIL_CORPO   VARCHAR2(4000);
  Z_NOME_CLI      OS_AGENDA.CLIENTE_NOME%TYPE;
  Z_DATA_AGENDADA OS_AGENDA.DATA_AGENDADA%TYPE;
  Z_QUEM_AGENDOU  OS_AGENDA.QUEM_ABRIU%TYPE;
  Z_OBSERVACOES   OS_AGENDA.OBSERVACOES%TYPE;
  Z_TECNICO       SERVICOS_TECNICOS.NOME%TYPE;

  CURSOR C_AGENDA IS
    SELECT A.CLIENTE_NOME,
           TRUNC(A.DATA_AGENDADA),
           A.QUEM_ABRIU,
           B.DESCRICAO,
           S.NOME
      FROM OS_AGENDA A, PRISMA_BOX B, SERVICOS_TECNICOS S
     WHERE A.PRISMA = B.PRISMA
       AND S.COD_TECNICO = B.COD_TECNICO
       AND A.COD_CLIENTE > 1
       AND TRUNC(A.DATA_AGENDADA) = TRUNC(SYSDATE) + 1;

BEGIN
  OPEN C_AGENDA;
  LOOP
    FETCH C_AGENDA
      INTO Z_NOME_CLI,
           Z_DATA_AGENDADA,
           Z_QUEM_AGENDOU,
           Z_OBSERVACOES,
           Z_TECNICO;
  
    EXIT WHEN C_AGENDA%NOTFOUND;
    V_EMAIL_CORPO := ('CLIENTE:' || Z_NOME_CLI || ' / DATA AG.:' ||
                     Z_DATA_AGENDADA || ' / CONSULTOR: ' || Z_QUEM_AGENDOU ||
                     ' / TECNICO: ' || Z_TECNICO);
    WENVIA_EMAIL_3(P_ASSUNTO      => 'TESTE ASSUNTO',
                   P_MENSAGEM     => V_EMAIL_CORPO,
                   P_REMETENTE    => 'email@...',
                   P_DESTINATARIO => 'email@...');
  END LOOP;
  CLOSE C_AGENDA;
END;
Editado pela última vez por WilsonJunior em Seg, 10 Mar 2014 12:32 pm, em um total de 1 vez.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Porquê não criar uma variável para concatenar todos os resultados de sua "V_EMAIL_CORPO" e só chamar a "WENVIA_EMAIL_3", com esta variávem concatenada de todos clientes, após o laço(LOOP)?

Porém dependendo da quantidade de clientes você pode ter outro problema. Não poder mais usar tipo VARCHAR2 para o corpo do email e sim uma estrutura maior, um LONG ou os LOB da vida.
WilsonJunior
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 10 Mar 2014 12:05 am
Localização: Araraquara

Noctifero escreveu:Porquê não criar uma variável para concatenar todos os resultados de sua "V_EMAIL_CORPO" e só chamar a "WENVIA_EMAIL_3", com esta variávem concatenada de todos clientes, após o laço(LOOP)?

Porém dependendo da quantidade de clientes você pode ter outro problema. Não poder mais usar tipo VARCHAR2 para o corpo do email e sim uma estrutura maior, um LONG ou os LOB da vida.

Olá, bom dia!
Humm .. na verdade nunca vai ultrapassar esse tamnho, porque temos apenas 36 horários disponíveis em cada loja, e pensando em um dia de movimento a oficina teria 36 clientes agendados por dia, sendo que cada registro retornaria no máximo 80 bytes cada .. não teria como estourar o tamanho de 32760.

Testei aqui e deu certo com a dica ..
Fico MUITO grato pela ajuda, vai evitar muita reclamação do responsável pela análise de crédito.

Abraços e mais uma vez, muito obrigado!
- Wilson.



Resultado final:

Selecionar tudo

CREATE OR REPLACE PROCEDURE WJOB_AGENDADOS AS
  -- PROC PARA ENVIAR E-MAIL DOS AGENDAMENTOS DO DIA POSTERIOR
  V_EMAIL_CORPO   VARCHAR2(32760);
  Z_NOME_CLI      OS_AGENDA.CLIENTE_NOME%TYPE;
  Z_DATA_AGENDADA OS_AGENDA.DATA_AGENDADA%TYPE;
  Z_QUEM_AGENDOU  OS_AGENDA.QUEM_ABRIU%TYPE;
  Z_OBSERVACOES   OS_AGENDA.OBSERVACOES%TYPE;
  Z_TECNICO       SERVICOS_TECNICOS.NOME%TYPE;
  CRLF            VARCHAR2(2) := CHR(13) || CHR(10);

  CURSOR C_AGENDA IS
    SELECT A.CLIENTE_NOME,
           TRUNC(A.DATA_AGENDADA),
           A.QUEM_ABRIU,
           B.DESCRICAO,
           S.NOME
      FROM OS_AGENDA A, PRISMA_BOX B, SERVICOS_TECNICOS S
     WHERE A.PRISMA = B.PRISMA
       AND S.COD_TECNICO = B.COD_TECNICO
       AND A.COD_CLIENTE > 1
          
       AND TRUNC(A.DATA_AGENDADA) = TRUNC(SYSDATE);

BEGIN
  OPEN C_AGENDA;
  V_EMAIL_CORPO := NULL;
  LOOP
    FETCH C_AGENDA
      INTO Z_NOME_CLI,
           Z_DATA_AGENDADA,
           Z_QUEM_AGENDOU,
           Z_OBSERVACOES,
           Z_TECNICO;
  
    EXIT WHEN C_AGENDA%NOTFOUND;
    V_EMAIL_CORPO := V_EMAIL_CORPO ||
                     ('CLIENTE:' || Z_NOME_CLI || ' / DATA AG.:' ||
                     Z_DATA_AGENDADA || ' / CONSULTOR: ' || Z_QUEM_AGENDOU ||
                     ' / TECNICO: ' || Z_TECNICO || CRLF || CRLF);
  END LOOP;
  WENVIA_EMAIL_3(P_ASSUNTO      => 'TESTE ASSUNTO',
                 P_MENSAGEM     => V_EMAIL_CORPO,
                 P_REMETENTE    => 'email@email',
                 P_DESTINATARIO => email@email');
  CLOSE C_AGENDA;
END;
Responder
  • Informação
  • Quem está online

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