以下のPL/SQL SPカーソル出力をHTMLテーブルとして保存し、添付ファイルとしてExcelファイルとして送信します。oracleでsys.UTL_MAIL.send_attach_rawを使用してクエリ出力中にexcel attachmentを送信する方法は?
ORA-06502: PL/SQL: numeric or value error: raw variable length too long
ORA-06512: at "SYS.UTL_MAIL", line 654
ORA-06512: at "SYS.UTL_MAIL", line 739
CREATE OR REPLACE PROCEDURE sp_send_mail_with_attch (
p_mode char,
p_message VARCHAR2 := '.',
p_subject VARCHAR2 := '.',
p_from VARCHAR2 := 'ITTEAM'
) AS
msg_from VARCHAR2(50);
msg_to VARCHAR2(4000);
message_to VARCHAR2(50);
mailhost VARCHAR2(30);
mailport VARCHAR2(20);
crlf VARCHAR2(2) := chr(13)|| chr(10);
msg_subject VARCHAR2(250);
tablehead VARCHAR2(32767);
message VARCHAR2(32767);
mainmsg VARCHAR2(32767);
v_errortext VARCHAR2(200);
v_errormsg VARCHAR2(200) := ' ';
v_error VARCHAR2(2000) := ' ';
mail_conn utl_smtp.connection;
attachment_text clob;
v_messageatt clob;
v_filedate varchar2(100);
CURSOR main_cursor IS
select customer_id,customer_name, to_char(validity_date,'DD-MON-YYYY') validity_date
FROM
(select(trunc(validity_date) - trunc(sysdate)) datediff,
a.* from table_name a WHERE lei_flag = 'Y'
) lei;
main_cursor_var main_cursor%rowtype;
begin
SELECT a.smtpserver,a.smtpserverport,'' toaddress,'' fromaddress
into mailhost,mailport,message_to,msg_from
from emailsettingtable a
WHERE ROWNUM < 2;
msg_from := p_from;
msg_to := '';
IF p_mode = '89' THEN
dbms_output.put_line('89');
msg_to := message_to;
msg_subject := 'CUSTOMER report';
message := '<html><head></head>';
message := message || '<body>';
message := message || 'Dear Sir/Madam,<br>';
message := message || 'Please find attached of Cutomer LEI Expiry<br>';
message := message || '<table>';
v_messageatt := '<html><head></head>';
v_messageatt := v_messageatt || '<body><br>';
v_messageatt := v_messageatt || '<table>';
OPEN main_cursor;
LOOP
FETCH main_cursor INTO main_cursor_var;
EXIT WHEN
(main_cursor%notfound);
IF main_cursor%rowcount = 1 THEN
v_messageatt := v_messageatt || '<tr><th>CUSTOMER ID</th><th>CUSTOMER NAME</th><th>VALIDITY DATE</th></tr>';
END IF;
v_messageatt := v_messageatt || '<tr>';
v_messageatt := v_messageatt|| '<td>'|| main_cursor%rowcount|| '</td>';
v_messageatt := v_messageatt|| '<td>'|| main_cursor_var.customer_id|| '</td>';
v_messageatt := v_messageatt || '<td>'|| main_cursor_var.CUSTOMER_NAME||'</td>';
v_messageatt := v_messageatt || '<td>'|| main_cursor_var.validity_date||'</td>';
v_messageatt := v_messageatt || '</tr>';
attachment_text := v_messageatt;
END LOOP;
CLOSE main_cursor;
dbms_output.put_line('89');
v_messageatt := v_messageatt || '</table>';
message := message || '</table>';
message := message|| '<br>'|| 'Regards,<br>'|| 'IT Team <br><br> ';
message := message || '</body></html>';
mainmsg := message;
dbms_output.put_line(message);
END IF;
dbms_output.put_line('msg_subject-->' || msg_subject);
dbms_output.put_line('MESSAGE-->' || message);
IF p_mode = '89' THEN
--msg_subject := 'LERM Counterparty - Exposure Data Uploaded sucessfully ...';
msg_to := msg_to || '[email protected]';
END IF;
select to_char(sysdate,'DD_MON_YYYYHH24:MI:SS') into v_filedate
from dual;
sys.utl_mail.send_attach_raw(
sender => msg_from,
recipients => msg_to,
cc => '',
bcc => '',
subject => msg_subject,
message => mainmsg,
mime_type => 'text/html',
priority => 1,
attachment => utl_raw.cast_to_raw(attachment_text),
att_inline => true,
att_mime_type => 'text/plain; charset=us-ascii',
att_filename => 'filename_'|| v_filedate|| '.xls',
replyto => ''
);
dbms_output.put_line('2');
msg_to := '';
dbms_output.put_line('Send Sucessfully ........');
EXCEPTION
WHEN others THEN
v_errortext := substr(sqlerrm,1,200);
dbms_output.put_line(sqlerrm);
END;
Alexandria PL/SQLライブラリを使用してPL/SQLからXLSXファイルを生成できます。https://github.com/mortenbra/alexandria-plsql-utils –