Oracle 通過儲存過程給關聯者發信

2021-07-09 13:27:54 字數 3477 閱讀 5325

create or replace procedure sp_send_mail(

p_recipient varchar2, -- 郵件接收人 多個接收人 中間用分號隔開就可以

p_subject varchar2, -- 郵件標題

p_message varchar2 -- 郵件正文)is

--下面四個變數請根據實際郵件伺服器進行賦值

v_mailhost varchar2(300) := 'smtp.qq.com'; --smtp伺服器位址

v_user varchar2(300) := '[email protected]'; --登入smtp伺服器的使用者名稱;只是使用者名稱,不包括163.com部分

v_pass varchar2(200) := '123456'; --登入smtp伺服器的密碼

v_sender varchar2(500) := '[email protected]'; --傳送都郵箱,一般與 ps_user 對應

v_conn utl_smtp.connection; --到郵件伺服器的連線

v_msg varchar2(4000); --郵件內容

type address_list is table of varchar2(100) index by binary_integer;

my_address_list address_list;

procedure p_splite_str(p_str varchar2, p_splite_flag int default 1) is

l_addr varchar2(254) := '';

l_len int;

l_str varchar2(4000);

begin

/*處理接收郵件位址列表,包括去空格、將;轉換為,等*/

l_str := trim(rtrim(replace(replace(p_str, ';', ','), ' ', ''), ','));

l_len := length(l_str);

for i in 1 .. l_len loop

if substr(l_str, i, 1) <> ',' then

l_addr := l_addr || substr(l_str, i, 1);

else

j := j + 1;

if p_splite_flag = 1 then

--表示處理郵件位址

--前後需要加上'<>',否則很多郵箱將不能傳送郵件

l_addr := '<' || l_addr || '>';

--呼叫郵件傳送過程

my_address_list(j) := l_addr;

end if;

l_addr := '';

end if;

if i = l_len then

j := j + 1;

if p_splite_flag = 1 then

--呼叫郵件傳送過程

l_addr := '<' || l_addr || '>';

my_address_list(j) := l_addr;

end if;

end if;

end loop;

end;

begin

p_splite_str(p_recipient);

v_conn := utl_smtp.open_connection(v_mailhost, 25);

utl_smtp.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo() 函式

--否則會報:ora-29279: smtp 永久性錯誤: 503 5.5.2 send hello first.

utl_smtp.command(v_conn, 'auth login'); -- smtp伺服器登入校驗

utl_smtp.command(v_conn,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_user))));

utl_smtp.command(v_conn,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_pass))));

utl_smtp.mail(v_conn, '<' || v_sender || '>'); --設定發件人

--utl_smtp.rcpt(v_conn, '<' || p_recipient || '>'); --設定收件人

for k in 1 .. my_address_list.count loop

--p_email(l_sendoraddress, my_address_list(k));

utl_smtp.rcpt(v_conn, my_address_list(k));

end loop;

-- rcpt to 送信先 迴圈送信

/* for idx in p_to_list.first .. p_to_list.last

loop

utl_smtp.rcpt(v_conn, '<' || p_to_list(idx).email || '>');

end loop;*/

---- 建立要傳送的郵件內容 注意報頭資訊和郵件正文之間要空一行

v_msg :='date:'|| to_char(sysdate, 'dd mon yy hh24:mi:ss')

|| utl_tcp.crlf || 'from: '|| v_sender || '<' || v_sender || '>'

|| utl_tcp.crlf || 'to: ' || p_recipient || '<' || p_recipient || '>'

|| utl_tcp.crlf || 'subject: ' || p_subject

|| utl_tcp.crlf || utl_tcp.crlf -- 這前面是報頭資訊

|| p_message; -- 這個是郵件正文

utl_smtp.open_data(v_conn); --開啟流

utl_smtp.write_raw_data(v_conn, utl_raw.cast_to_raw(v_msg)); --這樣寫標題和內容都能用中文

utl_smtp.close_data(v_conn); --關閉流

utl_smtp.quit(v_conn); --關閉連線

exception

when others then

dbms_output.put_line(dbms_utility.format_error_stack);

dbms_output.put_line(dbms_utility.format_call_stack);

end sp_send_mail;

oracle給員工加薪儲存過程

create or replace procedure lee update sala ascursor c row isselect from lee emp 0714 for update of sala begin for v row in c row loop if v row.sala 1...

Oracle儲存過程給變數賦值的方法

截止到目前我發現有三種方法可以在儲存過程中給變數進行賦值 1 直接法 如 v flag 0 2 select into 如 假設變數名為v flag,select count into v flag from students 3 execute immediate 變數名 一般是sql的selec...

Oracle儲存過程實現通過動態引數複製表

使用儲存過程複製表,使用儲存過程來複製錶比使用自定義函式更簡單,因為自定義函式返回多行結果需要用游標,但帶游標的查詢語句不能用於create as。create or replace procedure createtable tname in varchar2,id in number is sq...