我用UTL_SMTP写了个发邮件的函数,但要发从的数据很多,应该用那种数据类型做为邮件体呢VARCHAR2(32767)有点小,CLOB也是写不了多少条就报错,LONG写的要多一点,还是说我CLOB用的有问题用UTL_SMTP.WRITE_RAW_DATE(C,UTL_RAW.CAST_TO_RAW(V_BODY))

解决方案 »

  1.   


    nclob类型的字段吧,这个存储量可达128TB。
      

  2.   

    CLOB也可以达到128TB,但我好象听说直接给CLOB 赋值的话能用的字符长度很短
      

  3.   


    直接赋值就是字符串了,ORACLE将字符串隐式转换再存进去,所以最多是32767个字节
      

  4.   


    尽量用stream, 可以将clob内容分成多段,不断的写入。
      

  5.   

    4楼和5楼的方法也是我想的,我用异常处理看了下,600行数据赋值给clob变量,能赋值。用dbms_lob.getlength(v_clob) 得到的是235640,如果是字符的话应该会更大,但这过程都没有报错错的是写邮件的时候,这里好象没次只能写32767吧, 
      

  6.   

    我给你找了个tom的,我的不能发附件,我想写邮件体大于32767的,所以我用clob
    create or replace procedure html_email(
        p_to            in varchar2,
        p_from          in varchar2,
        p_subject       in varchar2,
        p_text          in varchar2 default null,
        p_html          in varchar2 default null,
        p_smtp_hostname in varchar2,
        p_smtp_portnum  in varchar2)
    is
        l_boundary      varchar2(255) default 'a1b2c3d4e3f2g1';
        l_connection    utl_smtp.connection;
        l_body_html     clob := empty_clob;  --This LOB will be the email message
        l_offset        number;
        l_ammount       number;
        l_temp          varchar2(32767) default null;
    begin
        l_connection := utl_smtp.open_connection( p_smtp_hostname, p_smtp_portnum );
        utl_smtp.helo( l_connection, p_smtp_hostname );
        utl_smtp.mail( l_connection, p_from );
        utl_smtp.rcpt( l_connection, p_to );    l_temp := l_temp || 'MIME-Version: 1.0' ||  chr(13) || chr(10);
        l_temp := l_temp || 'To: ' || p_to || chr(13) || chr(10);
        l_temp := l_temp || 'From: ' || p_from || chr(13) || chr(10);
        l_temp := l_temp || 'Subject: ' || p_subject || chr(13) || chr(10);
        l_temp := l_temp || 'Reply-To: ' || p_from ||  chr(13) || chr(10);
        l_temp := l_temp || 'Content-Type: multipart/alternative; boundary=' || 
                             chr(34) || l_boundary ||  chr(34) || chr(13) || 
                             chr(10);    ----------------------------------------------------
        -- Write the headers
        dbms_lob.createtemporary( l_body_html, false, 10 );
        dbms_lob.write(l_body_html,length(l_temp),1,l_temp);
        ----------------------------------------------------
        -- Write the text boundary
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        l_temp   := '--' || l_boundary || chr(13)||chr(10);
        l_temp   := l_temp || 'content-type: text/plain; charset=us-ascii' || 
                      chr(13) || chr(10) || chr(13) || chr(10);
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);    ----------------------------------------------------
        -- Write the plain text portion of the email
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(p_text),l_offset,p_text);    ----------------------------------------------------
        -- Write the HTML boundary
        l_temp   := chr(13)||chr(10)||chr(13)||chr(10)||'--' || l_boundary || 
                        chr(13) || chr(10);
        l_temp   := l_temp || 'content-type: text/html;' || 
                       chr(13) || chr(10) || chr(13) || chr(10);
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);    ----------------------------------------------------
        -- Write the HTML portion of the message
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(p_html),l_offset,p_html);    ----------------------------------------------------
        -- Write the final html boundary
        l_temp   := chr(13) || chr(10) || '--' ||  l_boundary || '--' || chr(13);
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);
        ----------------------------------------------------
        -- Send the email in 1900 byte chunks to UTL_SMTP
        l_offset  := 1;
        l_ammount := 1900;
        utl_smtp.open_data(l_connection);
        while l_offset < dbms_lob.getlength(l_body_html) loop
            utl_smtp.write_data(l_connection,
                                dbms_lob.substr(l_body_html,l_ammount,l_offset));
            l_offset  := l_offset + l_ammount ;
            l_ammount := least(1900,dbms_lob.getlength(l_body_html) - l_ammount);
        end loop;
        utl_smtp.close_data(l_connection);
        utl_smtp.quit( l_connection );
        dbms_lob.freetemporary(l_body_html);
    end;
    /
    show errors