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...