3

送信するメール本文のフォーマットに関して問題があります。

これがKOバージョンです(改行なし):

declare
  crlf                     VARCHAR2(2) := chr(13)||chr(10); 
  msg_body                 VARCHAR2(2000);
begin
  msg_body := msg_body || ('Blablah  : '|| SYSTIMESTAMP ) || crlf;
  msg_body := msg_body || ('Blablah  : '|| SYSTIMESTAMP ) || crlf;
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1''';
  UTL_MAIL.send(sender => 'xx@xx.com', recipients => 'yy@yy.com', subject => 'Blah', MESSAGE => msg_body);
end;

これがOKバージョンです(素敵な新しい行):

declare
  crlf                     VARCHAR2(2) := chr(13)||chr(10);
  msg_body                 VARCHAR2(2000);
begin
  msg_body := msg_body || ('Blablah  : ') || crlf;
  msg_body := msg_body || ('Blablah  : ') || crlf;
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1''';
  UTL_MAIL.send(sender => 'xx@xx.com', recipients => 'yy@yy.com', subject => 'Blah', MESSAGE => msg_body);
end;

よろしくお願いします

4

1 に答える 1

6

2つのバージョンの唯一の違いは、機能するバージョンでSYSTIMESTAMPが除外されていることです。

を使用して、SYSTIMESTAMPを明示的に文字に変換していませんTO_CHAR()。代わりに、 NLS_DATE_FORMATに従って暗黙的に変換されます。

希望するフォーマットモデルを使用して、文字に正しく変換します。例えば

to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss:ff3')

ff分数秒です。

引用するには

次の理由から、暗黙的または自動変換に依存するのではなく、明示的な変換を指定することをお勧めします。

  • 明示的なデータ型変換関数を使用すると、SQLステートメントが理解しやすくなります。

  • 暗黙的なデータ型変換は、特に列値のデータ型が定数のデータ型に変換される場合は、パフォーマンスに悪影響を与える可能性があります。

  • 暗黙的な変換は、それが発生するコンテキストによって異なり、すべての場合で同じように機能するとは限りません。たとえば、日時値からVARCHAR2値への暗黙の変換は、NLS_DATE_FORMATパラメーターの値によっては予期しない年を返す場合があります。

  • 暗黙的な変換のアルゴリズムは、ソフトウェアリリース間およびOracle製品間で変更される可能性があります。明示的な変換の動作はより予測可能です。


UTL_MAILの代わりにUTL_SMTPを使用して調査することをお勧めします。セッションを変更する必要はありません。本当に単純な送信手順は次のようになります。

declare

   l_to_list  long;
   l_crlf varchar2(2) := chr(13) || chr(10);
   l_conn utl_smtp.connection;
   l_date     varchar2(255) default to_char(sysdate, 'dd Mon yyyy hh24:mi:ss');

begin

   l_conn := utl_smtp.open_connection(<mailhost>, 25);
   utl_smtp.helo(l_conn, <mailhost>);
   utl_smtp.mail(l_conn, <sender>);

   l_to_list := address_email('To: ', <recipients>);

   utl_smtp.open_data(l_conn);

   utl_smtp.write_data('Date: ' || l_date);
   utl_smtp.write_data('From: ' || <sender>);
   utl_smtp.write_data('Subject: ' || nvl(<subject>, '(No Subject)'));
   utl_smtp.write_data('X-Mailer: ' || <mailer_id>);

   utl_smtp.write_data(l_to_list);

   utl_smtp.write_data(l_conn, '' || l_crlf);
   utl_smtp.write_data(l_conn, <msg>);
   utl_smtp.close_data(l_conn);
   utl_smtp.quit(l_conn);

end;
于 2013-01-18T11:57:33.243 に答える