以下の PL/SQL プロシージャのコードはバイト サイズをチェックし、30000 バイトを超える場合はデータを繰り返し、
30000 バイト (30 kb) ごとにメールの添付ファイル (複数のメールで txt ファイル) を送信します。Oracle PL/SQL で 4 MB のサイズのファイル全体を 1 つのメールで取得する
必要があります。
lv_message_tab のデータ型は varchar2(32767) です。* Varchar2(32767)の代わりにCLOBデータ型を使用できますか? * はいの場合、方法を提案してください。
何百万も前もって感謝します!!!
FOR lv_idx in 1..pv_message.COUNT
LOOP
lv_message := lv_message||pv_message(lv_idx)|| lv_cr;
IF LENGTH(lv_message) >= 30000
THEN
lv_message_tab.EXTEND;
lv_message_tab(lv_message_tab.LAST) := lv_message;
lv_message := null;
END IF;
END LOOP;
--This send the attachment for 30000 characters and above
IF lv_message_tab.COUNT > 0
THEN
FOR lv_idx in 1..lv_message_tab.COUNT
LOOP
UTL_SMTP.HELO(lv_conn, lv_smtp_host);
UTL_SMTP.MAIL(lv_conn, gc_sender);
UTL_SMTP.RCPT(lv_conn, lv_to_email_ids);
UTL_SMTP.RCPT(lv_conn, lv_cc_email_ids);
UTL_SMTP.DATA(lv_conn,
'Date: ' || TO_CHAR(SYSDATE, gc_dd_month_yyyy_format) || lv_cr ||
'From: ' || gc_sender || lv_cr ||
'Subject: '|| lv_subject || lv_cr ||
'To: ' || lv_to_email_ids || lv_cr ||
'CC: ' || lv_cc_email_ids || lv_cr ||
'MIME-Version: 1.0'|| lv_cr || -- Use MIME mail standard
'Content-Type: multipart/mixed;'|| lv_cr ||
' boundary="-----SECBOUND"'|| lv_cr ||
lv_cr ||
'-------SECBOUND'|| lv_cr ||
'Content-Type: text/plain;'|| lv_cr ||
' name="excel.csv"'|| lv_cr ||
'Content-Transfer_Encoding: 8bit'|| lv_cr ||
'Content-Disposition: attachment;'|| lv_cr ||
' filename="'||pv_file_name||'"'|| lv_cr ||
lv_cr ||lv_message_tab(lv_idx)
|| lv_cr || -- Content of attachment
lv_cr ||
'-------SECBOUND--' );
END LOOP;
END IF;
--This send the attachment for the rest of the data...for the last few iterations
IF lv_message IS NOT NULL
THEN
UTL_SMTP.HELO(lv_conn, lv_smtp_host);
UTL_SMTP.MAIL(lv_conn, gc_sender);
UTL_SMTP.RCPT(lv_conn, lv_to_email_ids);
UTL_SMTP.RCPT(lv_conn, lv_cc_email_ids);
UTL_SMTP.DATA(lv_conn,
'Date: ' || TO_CHAR(SYSDATE, gc_dd_month_yyyy_format) || lv_cr ||
'From: ' || gc_sender || lv_cr ||
'Subject: '|| lv_subject || lv_cr ||
'To: ' || lv_to_email_ids || lv_cr ||
'CC: ' || lv_cc_email_ids || lv_cr ||
'MIME-Version: 1.0'|| lv_cr || -- Use MIME mail standard
'Content-Type: multipart/mixed;'|| lv_cr ||
' boundary="-----SECBOUND"'|| lv_cr ||
lv_cr ||
'-------SECBOUND'|| lv_cr ||
'Content-Type: text/plain;'|| lv_cr ||
' name="excel.csv"'|| lv_cr ||
'Content-Transfer_Encoding: 8bit'|| lv_cr ||
'Content-Disposition: attachment;'|| lv_cr ||
' filename="'||pv_file_name||'"'|| lv_cr ||
lv_cr ||lv_message
|| lv_cr || -- Content of attachment
lv_cr ||
'-------SECBOUND--' );
END IF;
UTL_SMTP.QUIT(lv_conn);
pv_rtn := TRUE;
ELSE
pv_rtn := FALSE;
END IF;
コレクションテーブルとして入力を与えることでプロシージャを呼び出しています
手順
SP1_Send_letter_ATTACH_WAL(pv_job_id IN job.job_id%TYPE,
pv_status IN job_transaction_details.status_id%TYPE,
pv_subject IN VARCHAR2,
pv_message IN stringtable,
pv_file_name IN VARCHAR2,
pv_date_time IN DATE DEFAULT SYSDATE,
pv_rtn OUT BOOLEAN);
変数のデータをclob データ型pv_message
の変数に格納したいだけです。lv_message
lv_message CLOB;
lv_message := pv_message (つまり、コレクション データ型から CLOB 型へ) の格納方法。「to_clob()」関数を使用して型キャストしようとしましlv_message = to_clob(pv_message)
たが、うまくいきませんでした。