2017-10-01 8 views
0

以下の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; 
+0

Alexandria PL/SQLライブラリを使用してPL/SQLからXLSXファイルを生成できます。https://github.com/mortenbra/alexandria-plsql-utils –

答えて

0

は、あなたが(など、<table>..<tr>を使用して)HTMLドキュメントを作成し、RAWに、この単純なを変換することはできません。

しかし、私はCLOBデータ型を取る場合でも、次のエラーを取得しています。純粋にPL/SQLでExcelファイルを作成するのは非常に苦労します。おそらく、ここで解決策が見つかるでしょう。 1つの解決策は、Excelシートを生成する外部Javaプロシージャを呼び出すことです。

通常、よく知られた編成機能を使用して電子メールをHTML形式でフォーマットすることも、バイナリ形式のExcelファイルを添付することもできます。

utl_mail.send_attach_rawの添付ファイルは32kに制限されていますが、その他の制限もあります。私はUTL_SMTPを使用することをお勧めします。このパッケージは使用するのがより複雑ですが、より柔軟性があります。完全な例を見るにはhow to export data from log table to email body in oracleをご覧ください。

+0

コメント行なし99 "attachment => utl_raw.cast_to_raw(attachment_text )」 私はラインに何99のコメントを解除しないときに私のSPが正常に BUを実行し、 私はエラー エラーレポートを取得しています - ORA-06502:PL/SQL:数値または値のエラー ORA-06512:行45 06502で。 00000 - "PL/SQL:数値または値のエラー%s" – Syan

関連する問題