Oracle触发器发送邮件

Oracle触发器发送邮件

  • 一、创建触发器tr_yw_info_beforeinsert
  • 二、创建触发器tr_yw_info_beforeupdate
  • 三、发送邮件存过:send_mail()


一、创建触发器tr_yw_info_beforeinsert

CREATE OR REPLACE TRIGGER tr_yw_info_beforeinsertBEFORE INSERT ON yw_infoFOR EACH ROW
DECLAREv_content VARCHAR2(4000);v_fssj    VARCHAR2(50);v_clsj    VARCHAR2(50);v_date    VARCHAR2(20);v_title   VARCHAR2(1000);v_flxstr  VARCHAR2(50);v_gzlxstr VARCHAR2(50);v_tzfsstr VARCHAR2(50);v_cjrstr  VARCHAR2(50);v_cldwstr VARCHAR2(50);v_wcqkstr VARCHAR2(50);
BEGINSELECT 'YW' || seq_yw_info_info_id.nextval INTO :new.info_id FROM dual;SELECT to_char(:new.fs_time,'yyyy-mm-dd hh24:mi:ss')INTO v_fssjFROM dual;SELECT to_char(:new.cl_time,'yyyy-mm-dd hh24:mi:ss')INTO v_clsjFROM dual;SELECT to_char(SYSDATE,'yyyymmdd-hh24miss')INTO v_dateFROM dual;SELECT (CASE :new.info_type_idWHEN '40070' THEN(SELECT a.a01FROM yw_code aWHERE a.code_type = '1001'AND rownum = 1)WHEN '40071' THEN(SELECT a.a01FROM yw_code aWHERE a.code_type = '1005'AND rownum = 1)END)INTO v_flxstrFROM dual;SELECT (CASE :new.info_type_idWHEN '40070' THEN(SELECT a.code_descFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1001'AND a.code_value = :new.gzlx_id)WHEN '40071' THEN(SELECT a.code_descFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1005'AND a.code_value = :new.gzlx_id)END)INTO v_gzlxstrFROM dual;SELECT a.code_descINTO v_tzfsstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1002'AND a.code_value = :new.tzfs;SELECT b.desc_nameINTO v_cjrstrFROM iu_user bWHERE b.user_id = :new.cjr;SELECT a.code_descINTO v_cldwstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1003'AND a.code_value = :new.cldw;SELECT a.code_descINTO v_wcqkstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1004'AND a.code_value = :new.wcqk;v_title := '【运维管理平台】-' || v_date || '-' || v_cjrstr || '-新增信息';v_content := '【运维信息】新增,时间:' ||to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')|| '<br>'||CHR(13)||CHR(10) || '信息标识:'||:new.info_id|| '<br>'||CHR(13)||CHR(10) || '信息类别:'||v_flxStr|| '<br>'||CHR(13)||CHR(10) || '信息类型:'||v_gzlxStr|| '<br>'||CHR(13)||CHR(10) || '通知方式:'||v_tzfsStr|| '<br>'||CHR(13)||CHR(10) || '创建用户:'||v_cjrStr|| '<br>'||CHR(13)||CHR(10) || '发生时间:'||v_fssj|| '<br>'||CHR(13)||CHR(10) || '报障单位:'||:new.bzdw|| '<br>'||CHR(13)||CHR(10) || '报障人员:'||:new.bzr|| '<br>'||CHR(13)||CHR(10) || '详情描述:'||:new.xqms|| '<br>'||CHR(13)||CHR(10) || '处理时间:'||v_clsj|| '<br>'||CHR(13)||CHR(10) || '处理单位:'||v_cldwStr|| '<br>'||CHR(13)||CHR(10) || '处理人员:'||:new.clr|| '<br>'||CHR(13)||CHR(10) || '处理情况:'||:new.clqk|| '<br>'||CHR(13)||CHR(10) || '完成情况:'||v_wcqkStr|| '<br>'||CHR(13)||CHR(10) || '备注信息:'||:new.bz;--sendmail_yw_new(v_content);send_mail('tttzzzqqq@qq.com',v_title,v_content);send_mail('52487400@qq.com',v_title,v_content);
END;

二、创建触发器tr_yw_info_beforeupdate

CREATE OR REPLACE TRIGGER tr_yw_info_beforeupdateBEFORE UPDATE ON yw_infoFOR EACH ROW
DECLAREv_content VARCHAR2(4000);v_fssj    VARCHAR2(50);v_clsj    VARCHAR2(50);v_date    VARCHAR2(20);v_title   VARCHAR2(1000);v_flxstr  VARCHAR2(50);v_gzlxstr VARCHAR2(50);v_tzfsstr VARCHAR2(50);v_cjrstr  VARCHAR2(50);v_cldwstr VARCHAR2(50);v_wcqkstr VARCHAR2(50);v_flag    VARCHAR2(20); --更新还是删除
BEGINSELECT 'YW' || seq_yw_info_info_id.nextval INTO :new.info_id FROM dual;SELECT to_char(:new.fs_time,'yyyy-mm-dd hh24:mi:ss')INTO v_fssjFROM dual;SELECT to_char(:new.cl_time,'yyyy-mm-dd hh24:mi:ss')INTO v_clsjFROM dual;SELECT to_char(SYSDATE,'yyyymmdd-hh24miss')INTO v_dateFROM dual;SELECT (CASE :new.info_type_idWHEN '40070' THEN(SELECT a.a01FROM yw_code aWHERE a.code_type = '1001'AND rownum = 1)WHEN '40071' THEN(SELECT a.a01FROM yw_code aWHERE a.code_type = '1005'AND rownum = 1)END)INTO v_flxstrFROM dual;SELECT (CASE :new.info_type_idWHEN '40070' THEN(SELECT a.code_descFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1001'AND a.code_value = :new.gzlx_id)WHEN '40071' THEN(SELECT a.code_descFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1005'AND a.code_value = :new.gzlx_id)END)INTO v_gzlxstrFROM dual;SELECT a.code_descINTO v_tzfsstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1002'AND a.code_value = :new.tzfs;SELECT b.desc_nameINTO v_cjrstrFROM iu_user bWHERE b.user_id = :new.cjr;SELECT a.code_descINTO v_cldwstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1003'AND a.code_value = :new.cldw;SELECT a.code_descINTO v_wcqkstrFROM yw_code aWHERE a.del_flag = '0'AND a.code_type = '1004'AND a.code_value = :new.wcqk;--select :new.del_flag into v_delFlag from dual;IF :new.del_flag = '1' THENv_title := '【运维管理平台】-' || v_date || '-' || v_cjrstr || '-删除信息';v_flag  := '删除';ELSEv_title := '【运维管理平台】-' || v_date || '-' || v_cjrstr || '-更新信息';v_flag  := '更新';END IF;v_content := '【运维信息】' || v_flag || ',时间:' ||to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')|| '<br>'||CHR(13)||CHR(10) || '信息标识:'||:new.info_id|| '<br>'||CHR(13)||CHR(10) || '信息类别:'||v_flxStr|| '<br>'||CHR(13)||CHR(10) || '信息类型:'||v_gzlxStr|| '<br>'||CHR(13)||CHR(10) || '通知方式:'||v_tzfsStr|| '<br>'||CHR(13)||CHR(10) || '创建用户:'||v_cjrStr|| '<br>'||CHR(13)||CHR(10) || '发生时间:'||v_fssj|| '<br>'||CHR(13)||CHR(10) || '报障单位:'||:new.bzdw|| '<br>'||CHR(13)||CHR(10) || '报障人员:'||:new.bzr|| '<br>'||CHR(13)||CHR(10) || '详情描述:'||:new.xqms|| '<br>'||CHR(13)||CHR(10) || '处理时间:'||v_clsj|| '<br>'||CHR(13)||CHR(10) || '处理单位:'||v_cldwStr|| '<br>'||CHR(13)||CHR(10) || '处理人员:'||:new.clr|| '<br>'||CHR(13)||CHR(10) || '处理情况:'||:new.clqk|| '<br>'||CHR(13)||CHR(10) || '完成情况:'||v_wcqkStr|| '<br>'||CHR(13)||CHR(10) || '备注信息:'||:new.bz;--sendmail_yw_new(v_content);send_mail('tttzzzqqq@qq.com',v_title,v_content);
END;

三、发送邮件存过:send_mail()

CREATE OR REPLACE PROCEDURE send_mail(p_recipient VARCHAR2, -- 邮件接收人p_subject   VARCHAR2, -- 邮件标题p_message   VARCHAR2 -- 邮件正文) IS--下面四个变量请根据实际邮件服务器进行赋值v_mailhost VARCHAR2(30) := 'smtp.163.com'; --SMTP服务器地址v_user     VARCHAR2(30) := 'tttzzzqqq2019@163.com'; --登录SMTP服务器的用户名v_pass     VARCHAR2(20) := 'dttzq84'; --登录SMTP服务器的密码(密码如何得到看下面)v_sender   VARCHAR2(50) := 'tttzzzqqq2019@163.com'; --发送者邮箱,一般与 ps_user 对应v_conn     utl_smtp.connection; --到邮件服务器的连接v_msg      VARCHAR2(4000); --邮件内容
BEGIN-- 未经过SSL加密的为 25 PORTv_conn := utl_smtp.open_connection(v_mailhost,25); --建立TCP连接。 连接smtp.163.com的25号端口utl_smtp.helo(v_conn,v_mailhost); --ehlo() 客户端向服务器发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令。-- 服务器端以OK作为响应,表示准备接收。utl_smtp.command(v_conn,'AUTH LOGIN'); -- smtp服务器登录校验-- UTL_RAW.CAST_TO_RAW 解决不同字符集的数据库之间的相互访问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); --设置收件人-- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行-- CRLF: Carriage Return Line Feed  回车换行v_msg := 'Date:' || to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') || utl_tcp.crlf ||'From: ' || '<' || v_sender || '>' || utl_tcp.crlf || 'To: ' || '<' ||p_recipient || '>' || utl_tcp.crlf || 'Subject: ' || p_subject ||utl_tcp.crlf || 'Content-Type:text/html;charset=GBK' ||utl_tcp.crlf || utl_tcp.crlf -- 这前面是报头信息|| p_message; -- 这个是邮件正文-- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行/*  v_msg := 'Date:' || TO_CHAR(SYSDATE+1/3, 'dd mon yy hh24:mi:ss' )|| UTL_TCP.CRLF || 'From: ' || '<' || v_sender || '>'|| UTL_TCP.CRLF || 'To: ' || '<' || p_recipient || '>'|| UTL_TCP.CRLF || 'Subject: ' || p_subject|| UTL_TCP.CRLF || 'Content-Type:text/html;charset=GBK'|| UTL_TCP.CRLF || UTL_TCP.CRLF -- 这前面是报头信息|| p_message;  -- 这个是邮件正文*/dbms_output.put_line('------BEGIN------SEND_MAIL------');dbms_output.put_line('邮件发送成功!');dbms_output.put_line('报文信息:' || v_msg);dbms_output.put_line('------E N D------SEND_MAIL------' || chr(13) ||chr(10));utl_smtp.open_data(v_conn); --打开流--使用utl_raw.cast_to_raw与utl_mail.write_raw_data写邮件正文时可以用中文( 解决不同字符集的数据库之间的相互访问)utl_smtp.write_raw_data(v_conn,utl_raw.cast_to_raw(convert(v_msg,'ZHS16GBK'))); --这样写标题和内容都能用中文utl_smtp.close_data(v_conn); --关闭流utl_smtp.quit(v_conn); --关闭连接
EXCEPTIONWHEN OTHERS THENdbms_output.put_line('邮件发送失败!');dbms_output.put_line(dbms_utility.format_error_stack);dbms_output.put_line(dbms_utility.format_call_stack);
END send_mail;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/57072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言15-R语言中的列的分裂与合并长宽数据转换

列的分裂与合并 列的分裂&#xff1a; 使用 separate() 函数将一个包含多个值的列分裂成多个列。 install.packages("tidyr") # 安装 tidyr 包&#xff08;如果尚未安装&#xff09; library(tidyr)data <- data %>%separate(col_name, into c("part1…

响应式web-PC端web与移动端web(H5)兼容适配 选型方案

背景 项目需要&#xff0c;公司已经有一套PC端web&#xff0c;需要做一套手机端浏览器可用的&#xff0c;但是又想兼容pc端&#xff0c;适配的web项目。 以下是查阅到响应布局现成的开源模版。根据自己技术栈&#xff0c;vue2,js来搜索相关的开源项目。 RuoYi 使用若依快速…

[数据集][目标检测]垃圾目标检测数据集VOC格式14963张44类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;14963 标注数量(xml文件个数)&#xff1a;14963 标注类别数&#xff1a;44 标注类别名称:["toiletries","plastic utensi…

【LeetCode75】第三十七题 二叉树中的最长交错路径

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;问我们在这棵树里能找到的最长交错路径。最长交错路径就是在二叉树里一左一右一左一右这样走&#xff0c;最…

[国产MCU]-W801开发实例-ADC与芯片温度采集

ADC与芯片温度采集 文章目录 ADC与芯片温度采集1、ADC模块介绍2、W801中ADC的驱动API介绍3、硬件准备4、软件准备5、采集输入电压及芯片温度本文将详细介绍如何使用W801的ADC模块,并通过ADC模块采集W801内置温度值。 1、ADC模块介绍 W801的ADC基于Sigma-Delta ADC采集模块,最…

后端面试话术集锦第三篇:spring cloud 面试话术

🚗后端面试集锦目录 💖后端面试话术集锦第一篇:spring面试话术💖 💖后端面试话术集锦第二篇:spring boot面试话术💖 💖后端面试话术集锦第三篇:spring cloud面试话术💖 💖后端面试话术集锦第四篇:ElasticSearch面试话术💖 💖后端面试话术集锦第五篇:r…

利用深度蛋白质序列嵌入方法通过 Siamese neural network 对 virus-host PPIs 进行精准预测【Patterns,2022】

研究背景&#xff1a; 病毒感染可以导致多种组织特异性损伤&#xff0c;所以 virus-host PPIs 的预测有助于新的治疗方法的研究&#xff1b;目前已有的一些 virus-host PPIs 鉴定或预测方法效果有限&#xff08;传统实验方法费时费力、计算方法要么基于蛋白结构或基因&#xff…

以太网交换机高稳定性时钟系统应用方案

随着网络技术的不断发展&#xff0c;我们的生活也发生着巨大的变化&#xff0c;这离不开以太网起到的重大作用&#xff0c;全球大部分地区的以太网交换机市场都出现了增长。 那么&#xff0c;平常我们所说的以太网交换机到底是什么&#xff1f;今天小扬给大家科普科普以太网交…

ubuntu学习(六)----文件编程实现cp指令

1 思路 Linux要想复制一份文件通常指令为&#xff1a; cp src.c des.c 其中src.c为源文件&#xff0c;des.c为目标文件。 要想通过文件编程实现cp效果&#xff0c;思路如下 1 首先打开源文件 src.c 2 读src到buf 3 创建des.c 4 将buf写入到des.c 5 close两个文件 2 实现 vi …

第一次实验:Protocol Layers

第一次实验&#xff1a;Protocol Layers 捕获跟踪*Pick a URL and fetch it with* wget *or* curl*.* 检查跟踪数据包结构协议开销复用密钥*Which Ethernet header field is the demultiplexing key that tells it the next higher layer is IP?**Which IP header field is th…

get请求报错400 非法参数

get请求报错400 非法参数 背景&#xff1a;get请求数据&#xff0c;SpringBoot提供接口&#xff0c;返回400&#xff0c;报错非法参数此种情况排除接口本身错误之外&#xff0c;检查参数中有没有特殊字符 " < > [ \ ] ^ { | } 我这边就是因为其中一个参数中有中括…

(Deep Learning)准确率和召回率的基础概念

算法模型极大的提升了对各类结果的预测效率。 【算法模型的本质】 算法模型的本质&#xff0c;是基于输入的各类变量因子&#xff0c;通过计算规则&#xff08;模型or公式&#xff09;&#xff0c;得出预测结果。 典型的预测结果比如&#xff1a; 1.&#xff08;通过历史行为…

基于XML实现SpringIoC配置

目录 SpringIoc创建与使用的大致步骤 一.基于xml配置SpringIoc 二.基于xml配置DI 三.创建IoC容器并获取组件 SpringIoc创建与使用的大致步骤 SpringIoC的创建与使用过程分为3步 1.编写配置信息&#xff08;编写XML&#xff0c;注解、Java类&#xff09; 2.创建IoC容器&…

来了,metaRTC7.0 标准版

概要 metaRTC7.0 标准版b0版本将于8月底发布&#xff0c;新版本将metaRTC产品化中遇到的问题进行了汇总改进&#xff0c;修复了产品化中多个bug&#xff0c;并新增了多个产品化实用的功能模块。 更少bug&#xff0c;更少加班 企业版在适应多场景产品化中曾经遇到多种问题&am…

菜鸟教程《Python 3 教程》笔记(9):集合

菜鸟教程《Python 3 教程》笔记&#xff08;9&#xff09; 9 集合9.1 集合的基本操作9.2 集合内置方法9.2.1 add()、update()9.2.2 pop()、remove()、discard()9.2.3 difference()、differece_update()等9.2.4 isdisjoint()9.2.5 issubset()、issuperset() 9 集合 出处&#x…

pytorch中torch.gather()简单理解

1.作用 从输入张量中按照指定维度进行索引采集操作&#xff0c;返回值是一个新的张量&#xff0c;形状与 index 张量相同&#xff0c;根据指定的索引从输入张量中采集对应的元素。 2.问题 该函数的主要问题主要在dim维度上&#xff0c;dim0 表示沿着第一个维度&#xff08;行…

AD中如何给过孔添加盖油

AD中如何给过孔添加盖油 画PCB时通常我们会放一些过孔&#xff0c;起到上下层信号转接或者地过孔的作用&#xff0c;当这些过孔较大较密时如果不做盖油处理&#xff0c;就会影响电气性能而且很不美观。如下图&#xff1a; 如果要盖油&#xff0c;点击对应的过孔&#xff0c;将…

代码随想录Day_45打卡

①、爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 事例&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 思路&am…

解决华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…

网站和API支持HTTPS,最好在Nginx上配置

随着我们网站用户的增多&#xff0c;我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下&#xff0c;要从HTTP升级到HTTPS&#xff0c;让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手&#xff0c;从HTTP升级到HTTPS&#xff0c;同时支持静态网站和…