Oracle触发器创建定时任务
源码
CREATE OR REPLACE TRIGGER "CPM_NEW_EMAIL_INSERT_TRIGGER" BEFORE INSERT ON "AW_B01_000010_000001" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
DECLAREMESSAGE VARCHAR2(1000);--邮件的内容TITLE VARCHAR2(1000);--邮件主题V_SQL VARCHAR2(1000);--SQL语句ADDRESS VARCHAR2(1000);--邮箱地址V_ERRORCODE VARCHAR2(200); --异常代码V_ERRORTEXT VARCHAR2(4000); --异常信息PRAGMA AUTONOMOUS_TRANSACTION;--异常处理
BEGINIF (:NEW.ADDRESS IS NULL) THEN--如果邮箱地址为空,证明是新增的定时发送邮件配置MESSAGE:=:NEW.CONTENT;--邮件内容TITLE:=:NEW.TITLE;--邮件标题V_SQL:='SELECT LISTAGG(ADDRESS,'';'') WITHIN GROUP(ORDER BY ADDRESS) FROM AW_B01_000010_000001 A WHERE A.MATTER='''||:NEW.MATTER||''' ';EXECUTE IMMEDIATE V_SQL INTO ADDRESS;--查询出需要发送哪些邮箱--创建定时任务DECLAREJOB NUMBER;BEGINDBMS_JOB.SUBMIT(JOB => JOB,WHAT => 'DECLAREX_RETURN_MSG VARCHAR2(1);X_RETURN_STATUS VARCHAR2(200);BEGINTGK_REP.COE_SEND_MAIL_PKG.SEND_MAIL(P_TO=> '''||ADDRESS||''',P_SUBJECT =>'''||TITLE||''',P_MESSAGE =>'''||MESSAGE||''',X_RETURN_STATUS => X_RETURN_STATUS,X_RETURN_MSG => X_RETURN_MSG);DBMS_OUTPUT.PUT_LINE(X_RETURN_STATUS);DBMS_OUTPUT.PUT_LINE(X_RETURN_MSG);INSERT INTO COE_SEND_EMAIL_RECORD(STATUS,MESSAGE,TEXT) VALUES(X_RETURN_STATUS,X_RETURN_MSG,'''||MESSAGE||''');END;',NEXT_DATE =>TO_DATE(TO_CHAR(:NEW.TIME, 'YYYY/MM/DD')||' 10:00:00', 'YYYY-MM-DD HH24:MI:SS'));END;--新增的是邮箱地址ELSEFOR ROW_CUR_FIRST_INDEX IN (SELECT * FROM AW_B01_000010_000001 A WHERE A.MATTER=:NEW.MATTER) LOOPIF ROW_CUR_FIRST_INDEX.TIME IS NOT NULL THEN--筛选出需要发送的记录ADDRESS:=:NEW.ADDRESS;TITLE:=ROW_CUR_FIRST_INDEX.TITLE;--邮件标题MESSAGE:=ROW_CUR_FIRST_INDEX.CONTENT;--邮件内容DECLAREJOB NUMBER;BEGINDBMS_JOB.SUBMIT(JOB => JOB,WHAT => 'DECLAREX_RETURN_MSG VARCHAR2(1);X_RETURN_STATUS VARCHAR2(200);BEGINTGK_REP.COE_SEND_MAIL_PKG.SEND_MAIL(P_TO=> '''||ADDRESS||''',P_SUBJECT =>'''||TITLE||''',P_MESSAGE =>'''||MESSAGE||''',X_RETURN_STATUS => X_RETURN_STATUS,X_RETURN_MSG => X_RETURN_MSG);DBMS_OUTPUT.PUT_LINE(X_RETURN_STATUS);DBMS_OUTPUT.PUT_LINE(X_RETURN_MSG);INSERT INTO COE_SEND_EMAIL_RECORD(STATUS,MESSAGE,TEXT) VALUES(X_RETURN_STATUS,X_RETURN_MSG,'''||MESSAGE||''');END;',NEXT_DATE =>TO_DATE(TO_CHAR(ROW_CUR_FIRST_INDEX.TIME, 'YYYY/MM/DD')||' 10:00:00', 'YYYY-MM-DD HH24:MI:SS'));END;END IF;END LOOP;END IF;COMMIT;--异常捕获
EXCEPTIONWHEN OTHERS THEN--异常代码获取V_ERRORCODE := SQLCODE;--异常信息获取V_ERRORTEXT := SUBSTR(SQLERRM || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,4000);--插入日志表(异常信息插入)INSERT INTO TGK_LOAD_ERROR(OBJECT_NAME, SPLITSTR, ERRNUM, ERRMSG, INSERT_TIME)VALUES('AW_B01_000007_000001','触发器报错',V_ERRORCODE,V_ERRORTEXT,SYSDATE);
END;
需求:在对某张表进行插入或者修改时,获取时间以及内容,作为定时发送邮件的内容和时间来创建定时任务。
须知:用户要求有两种情况:第一种是新增或者修改一个或者多个邮箱;第二种是新增或者修改多个邮件的标题内容和发送时间。所以需要进行判断。
当邮箱地址不为空时,证明用户新增的是邮箱地址,如果做的是修改操作,则需要删掉旧的定时任务,然后获取对应的邮件标题内容时间加上地址组合成一个新的定时任务。
当邮箱地址为空时,证明是新增的邮件标题内容时间,这时候循环遍历需要发送的邮箱组成一个定时任务即可。如果是修改,则通过标题和内容去匹配旧的定时任务进行删除,然后创建新的定时任务。
实现:
创建触发器:
CREATE OR REPLACE TRIGGER "CPM_NEW_EMAIL_INSERT_TRIGGER" BEFORE INSERT ON "AW_B01_000010_000001" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
CPM_NEW_EMAIL_INSERT_TRIGGER
代表触发器的名称。
BEFORE INSERT ON "AW_B01_000010_000001"
代表在表AW_B01_000010_000001插入数据时触发,BEFORE UPDATE就是在表修改数据时触发
REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
就是对于每一条新增的数据,OLD作为旧数据,NEW作为新数据,插入操作时候OLD是不会有数据的,只有在修改操作的时候才会有。
定义变量
MESSAGE VARCHAR2(1000);--邮件的内容TITLE VARCHAR2(1000);--邮件主题V_SQL VARCHAR2(1000);--SQL语句ADDRESS VARCHAR2(1000);--邮箱地址V_ERRORCODE VARCHAR2(200); --异常代码V_ERRORTEXT VARCHAR2(4000); --异常信息PRAGMA AUTONOMOUS_TRANSACTION;--异常处理
PRAGMA AUTONOMOUS_TRANSACTION
用于捕获异常,当出现异常的时候就会跳到最后面的异常捕获
判断情况,创建定时任务
IF (:NEW.ADDRESS IS NULL) THEN--如果邮箱地址为空,证明是新增的定时发送邮件配置MESSAGE:=:NEW.CONTENT;--邮件内容TITLE:=:NEW.TITLE;--邮件标题V_SQL:='SELECT LISTAGG(ADDRESS,'';'') WITHIN GROUP(ORDER BY ADDRESS) FROM AW_B01_000010_000001 A WHERE A.MATTER='''||:NEW.MATTER||''' ';EXECUTE IMMEDIATE V_SQL INTO ADDRESS;--查询出需要发送哪些邮箱--创建定时任务DECLAREJOB NUMBER;BEGINDBMS_JOB.SUBMIT(JOB => JOB,WHAT => 'DECLAREX_RETURN_MSG VARCHAR2(1);X_RETURN_STATUS VARCHAR2(200);BEGINTGK_REP.COE_SEND_MAIL_PKG.SEND_MAIL(P_TO=> '''||ADDRESS||''',P_SUBJECT =>'''||TITLE||''',P_MESSAGE =>'''||MESSAGE||''',X_RETURN_STATUS => X_RETURN_STATUS,X_RETURN_MSG => X_RETURN_MSG);DBMS_OUTPUT.PUT_LINE(X_RETURN_STATUS);DBMS_OUTPUT.PUT_LINE(X_RETURN_MSG);INSERT INTO COE_SEND_EMAIL_RECORD(STATUS,MESSAGE,TEXT) VALUES(X_RETURN_STATUS,X_RETURN_MSG,'''||MESSAGE||''');END;',NEXT_DATE =>TO_DATE(TO_CHAR(:NEW.TIME, 'YYYY/MM/DD')||' 10:00:00', 'YYYY-MM-DD HH24:MI:SS'));END;
触发器中变量的赋值格式:变量名:=:NEW.字段
例如将新增记录的name赋值给username变量写法就是:USERNAME:=:NEW.NAME
运行SQL以及将运行结果赋值给变量
这里涉及到如何在触发器中,前后存在单引号时如何传入带引号的字符串与变量的问题。
带引号的字符串:下面的SQL需要将查询出来的数据用分号(“:”)进行拼接,在单引号内传入‘;’时,就需要在‘;’外面再套一层单引号进行转义,正确的写法是两个单引号 ‘’;‘’
传入触发器里面的变量:'''||:NEW.MATTER||'''
最后将SQL语句运行并将运行结果赋值到另外一个变量EXECUTE IMMEDIATE V_SQL INTO ADDRESS;
V_SQL就是需要运行的语句,ADDRESS就是接收结果的变量
V_SQL:='SELECT LISTAGG(ADDRESS,'';'') WITHIN GROUP(ORDER BY ADDRESS) FROM AW_B01_000010_000001 A WHERE A.MATTER='''||:NEW.MATTER||''' ';
EXECUTE IMMEDIATE V_SQL INTO ADDRESS;--查询出需要发送哪些邮箱
创建定时任务
what中存放需要执行的语句,可以是一段SQL,NEXT_DATE就是执行时间,可以设为一个固定时间,也可以设置为每隔一段时间运行,TO_DATE(TO_CHAR(:NEW.TIME, 'YYYY/MM/DD')||' 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
意思就是获取新增数据中的时间加上早上十点转化为字符串格式再转回时间格式。这里没有设置间隔时间(Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
),所以定时任务只会执行一次,执行完毕定时任务则自动删除。其他相关的时间间隔表达式见另外一篇文章。链接:https://blog.csdn.net/qq_43582366/article/details/120847167
--创建定时任务DECLAREJOB NUMBER;BEGINDBMS_JOB.SUBMIT(JOB => JOB,WHAT => '放需要执行的语句',NEXT_DATE =>TO_DATE(TO_CHAR(:NEW.TIME, 'YYYY/MM/DD')||' 10:00:00', 'YYYY-MM-DD HH24:MI:SS'));
异常捕获
关于COMMIT:客户说触发器会自动commit,不用在代码里面写,但是本人尝试过很多次,不加commit虽然触发器不会报错,数据也正常插入表格,但是不会创建触发器,所以猜测commit是为了提交创建触发器的代码。
COMMIT;--异常捕获
EXCEPTIONWHEN OTHERS THEN--异常代码获取V_ERRORCODE := SQLCODE;--异常信息获取V_ERRORTEXT := SUBSTR(SQLERRM || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,4000);--插入日志表(异常信息插入)INSERT INTO TGK_LOAD_ERROR(OBJECT_NAME, SPLITSTR, ERRNUM, ERRMSG, INSERT_TIME)VALUES('AW_B01_000007_000001','触发器报错',V_ERRORCODE,V_ERRORTEXT,SYSDATE);
Oracle触发器创建定时任务相关推荐
- oracle中触发器的创建,Oracle触发器创建及其功能
Oracle触发器创建及其功能 下面的文章主要介绍的是如何创建Oracle触发器,同时介绍了Oracle触发器的功能.语法,而且通过具体的例子可以让大家更深入的`掌握. 1.创建表t1 :create ...
- Oracle数据库创建定时任务
公司有个数据表存储的是文件上传服务器的历史表,有个字段存储的是文件的二进制流,必然要定时删除这个表里面的数据,这个就想到了oracle里面的定时任务. 我们使用的数据库连接工具是pl/sql Deve ...
- Oracle之创建定时任务
PLSQL创建定时任务DBMS_Jobs,在PLSQL中的DBMS_Jobs下直接手工创建. 对于参数Interval(间隔) 的设置,有以下几种比较常见: 间隔/interval是指上一次执行结束到 ...
- oracle中创建触发器
从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...
- SQL server与Oracle触发器的创建与使用
SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...
- Oracle 使用DBMS_JOB和DBMS_SCHEDULER 创建定时任务 创建管理job示例
使用DBMS_JOB和DBMS_SCHEDULER创建.管理job示例 原创 Oracle 作者:Hoegh 时间:2015-04-28 16:52:41 6439 0 DBMS_JOB和DBMS ...
- oracle创建触发器的作用,Oracle触发器简介
在学习Oracle之前,我听说过触发器,但是我从未在工作中使用过触发器. 我认为触发器是一件神秘而困难的事,因此我没有认真研究它. 我了解了赵老师今晚谈论的触发因素,发现触发因素并不像我想的那样神秘. ...
- oracle 创建定时任务
oracle 创建定时任务 declarexjobid number; BEGINDBMS_JOB.SUBMIT( JOB => xjobid, /*自动生成JOB_ID*/ WHAT => ...
- oracle如何创建一个定时任务,怎么创建定时任务
如何创建定时任务? 本帖最后由 minl 于 2013-11-27 14:16:37 编辑 使用dbms_scheduler这个包,但是创建完后似乎不执行. begin DBMS_SCHEDULER. ...
最新文章
- simpledateformat 毫秒_阿里巴巴 | 为啥代码中禁用static修饰SimpleDateFormat?
- VTK:旋转actor用法实战
- Qt Creator批注设计
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序...
- java房源信息管理的代码_crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫
- WPF之无法触发KeyDown或者KeyUp键盘事件
- [html] 举例说明HTML5出来后,有哪些HTML标签被弃用了?
- 记一次FFMPEG转avi视频保存到ftp服务器的失败尝试
- silverlight安装后仍提示未安装_CAD提示“许可管理器不起作用或未正确安装”?来,我来教你方法...
- Solaris10 swap空间管理
- Document Star证件照大师升级版 for Mac(支持ps2021)
- 记一次渗透之旅 ,网络安全学习至上
- Android 免root 备份数据,真正免root的完美备份详细使用教程
- 个人财务管理系统设计与实现
- 《Python编程:从入门到实践》最高温度, 最低温度可视化
- 微信小程序单个页面导航栏 设置
- Ubuntu如何发音
- HADOOP |MapReduce篇 (08) MapReduce特性
- 安装深度linux系统卡住不动,Linux安装系统卡住
- 短线黄金做波段的策略分析