2017-06-30 73 views
1

我有一個用於發送郵件的發送郵件過程。我將編寫過程從sql中獲取值,並將值傳遞給send_mail過程以接收郵件,但是當我嘗試發送1000個記錄時,它會給出數字或值錯誤。有人可以幫助我重寫我的send_mail過程來發送CLOB,以便大小不會是一個約束。 下面給出的是我的程序。在PLSQL中處理CLOB數據的郵件過程

PROCEDURE send_mail (SUBJECT IN CLOB,MAIL_HEADER IN CLOB) 
IS 
     l_connection utl_smtp.connection; 
     p_smtp_hostname varchar2(200) := 'localhost'; 
     p_smtp_portnum varchar2(200) := '25'; 
     p_from varchar2(200) := '[email protected]'; 
     p_to VARCHAR2(400) := 'to[email protected]'; 
    l_temp CLOB; 
    p_env VARCHAR2(3000) := ''; 

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); 
    utl_smtp.open_data(l_connection); 
    l_temp := 'MIME-Version: 2.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: '|| SUBJECT || p_env || chr(13) || chr(10); 
    l_temp := l_temp || 'Reply-To: ' || p_to || chr(13) || chr(10); 
    l_temp := l_temp || 'Content-type: text/html;' || 
    chr(13) || chr(10) || chr(13) || chr(10); 
    utl_smtp.write_data(l_connection, l_temp); 
    utl_smtp.write_data(l_connection, MAIL_HEADER); 
    utl_smtp.close_data(l_connection); 
    utl_smtp.quit(l_connection); 
EXCEPTION 
WHEN OTHERS THEN 
    RAISE; 
END send_mail; 

回答

0

即使這樣,您聲明l_tempCLOB,這仍然讓你與32767個字符的限制。

這是sys.utl_smtp包中的實際聲明。所以你有你的字符限制,遠遠低於CLOB

PROCEDURE WRITE_DATA(
    C  IN OUT NOCOPY CONNECTION, 
    DATA IN   VARCHAR2 CHARACTER SET ANY_CS 
); 

什麼你可以嘗試是,打破你的CLOB爲VARCHAR變量的數據塊,並調用write_data多次

此功能可以用來分割CLOB - DBMS_LOB.SUBSTR

+0

我在PLSQL是新的。你可以讓我知道我應該在哪裏實施這個。 – jabbars

+0

@jabbars檢查更新的答案 –

+0

當我試圖從第一個程序調用我的sen_mail過程時,仍然出現數字或值錯誤 – jabbars