Oracle 触发器学习笔记一
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
实例一:
create or replace trigger UpdateEleHealthCard
before insert ON hisapplicationform
--after insert or update on hisapplicationform
--after insert on hisapplicationform
for each row
DECLARE elehealthcardValue varchar2(100);
idwhere varchar2(100);
BEGIN
--错误赋值方式
--select new.HEALTHCARD into elehealthcard from dual;
-- select new.ID into idwhere from dual;
-- dbms_output.put_line('elehealthcard=='|| elehealthcard);
-- dbms_output.put_line('idwhere=='|| idwhere);
--方式一
:new.elehealthcard := :new.HEALTHCARD;
dbms_output.put_line('电子健康卡号:'|| :new.elehealthcard); --方式二 赋值方式
/* elehealthcardValue:=:new.HEALTHCARD;
idwhere:=:new.ID;
dbms_output.put_line('elehealthcard=='||elehealthcardValue);
dbms_output.put_line('id=='||idwhere);
--数据变更
update hisapplicationform set elehealthcard=elehealthcardValue where id=idwhere;*/ END;
实例二:
create or replace trigger INS_QS_QueueBusiness
before insert on QS_QUEUEBUSINESS
for each row
declare
nextid number;
begin
if :new.id is null or :new.id=0 then
select SEQUENCE_BUSINESS.NEXTVAL into nextid from dual;
:new.id := nextid;
end if;
end INS_QS_QueueBusiness;
实例三:
create or replace trigger INS_QS_US_Type
after insert or update on us_Type
for each row
declare --完成提交登记数据的同时,产生排队叫号队列数据
sBUSINESSID varchar2(5);
iQUEUEID integer;
iOldQueueID integer;
sPATNAME varchar2(50);
iPATID integer;
iSTUDYID integer;
sHISID varchar2(50);
dENROLDATE date;
icount integer;
sClinsitPat varchar2(20);
sPartOfCheck varchar2(100);
sPhotoNo varchar2(50);
iTotalFee FLOAT;
sSex varchar2(20);
sAge varchar2(20);
sLodgeSection varchar2(20);
sLodgeDoctor varchar2(20);
dBirth date; sSTATUS varchar2(10);
iSortno integer;--2009-10-13增加过号 oldDate date;
newDate date;
imaxID number;
iEndNo number;
dayhr number;
xflag number;
begin
select count(*) into icount from qs_queue;
if icount=0 then
return;
end if; --队列当前最大号初始化
select trunc(LASTINITDATE) into oldDate from QS_QUEUE where rownum=1; --上次登记日期,即系统日期的前一天
select trunc(sysdate) into newDate from dual; --数据库系统日期 iSTUDYID := :new.ID;
iQUEUEID := :new.ustype;
--iPATID := :new.Patientid;
sSTATUS := '已登记';
--检查号
--select to_date(enroldate,'yyyy-mm-dd'), cliisinpat,partofcheck,
-- into dENROLDATE,sClinsitPat,sPartOfCheck from us_studies where studyid= iStudyid; --登记日期
--select name,HisID into sPATNAME,sHISID from us_patient where patientid= iPATID;--患者姓名、HISID select a.name,a.HisID, a.patientid, b.cliisinpat,b.partofcheck,b.photono,
a.sex,to_date(a.birthdate,'yyyy-mm-dd'), b.age||b.ageunit as age,b.lodgesection,b.lodgedoctor,
b.totalfee,to_date(b.enroldate,'yyyy-mm-dd')
into sPATNAME,sHISID,iPATID, sClinsitPat, sPartOfCheck,sPhotoNo,
sSex,dBirth,sAge,sLodgeSection,sLodgeDoctor,iTotalFee,dENROLDATE
from us_patient a ,us_studies b
where a.patientid= b.patientid and b.studyid= iSTUDYID;--患者姓名、HISID if newDate>oldDate then--删除两天前的数据
begin
if dEnrolDate = newDate then --如果登记日期等于系统日期时,修改上次登记日期和最大队列号
begin
select MAXBUSIID2 into imaxID from QS_QUEUE where QUEUEID = :new.ustype;
if imaxID > 0 then
begin
update qs_queue set maxbusiid = MAXBUSIID2;
update qs_queue set MAXBUSIID2 = MAXBUSIID3;
update qs_queue set MAXBUSIID3 = STARTNO,LASTINITDATE=newDate,flag=0; --比较日期,初始化各队列的信息
end;
end if;
delete from QS_QUEUEBUSINESS where trunc(enroldate) <= trunc(newDate); --删除两天前的数据
end;
end if;
end;
end if; /* --add by yzl...同一天且分上下午( 13点以后约的从1开始 )..begin */
select to_number(to_char(sysdate,'hh24') ) into dayhr from dual; select flag into xflag from qs_queue where rownum=1; if (newDate=oldDate) and (dayhr>=13) and (xflag=0) then
begin
select MAXBUSIID2 into imaxID from QS_QUEUE where QUEUEID = :new.ustype;
if imaxID > 0 then
begin
update qs_queue set maxbusiid = MAXBUSIID2;
update qs_queue set MAXBUSIID2 = MAXBUSIID3;
update qs_queue set MAXBUSIID3 = STARTNO,flag=1; --比较日期,初始化各队列的信息
end;
end if;
delete from QS_QUEUEBUSINESS where trunc(enroldate) <= trunc(newDate); --删除两天前的数据
end;
end if;
/* --add by yzl...同一天且分上下午( 12点以后约的从1开始 ).. end */ --队列号为0时,退出
if :new.ustype = 0 then
return;
end if; --登记时,首先判断登记日期是不是数据库系统日期,如果是,则取MAXBUSIID为最大队列号,
--如果比数据库日期大一天,则取MAXBUSIID2,如果大两天,取MAXBUSIID3
if dENROLDATE = newDate then
begin
select MAXBUSIID2 ,ENDNO into imaxID,iEndNo from QS_QUEUE where QUEUEID = :new.ustype;
if imaxId = -1 then
update qs_queue set maxbusiid2 = startno, maxbusiid3 = startno ;
end if; select MAXBUSIID +1,ENDNO into imaxID,iEndNo from QS_QUEUE where QUEUEID = :new.ustype; --登记日期 = 数据库系统日期
end;
elsif dENROLDATE = newDate + 1 then
begin
select MAXBUSIID2 +1,ENDNO into imaxID,iEndNo from QS_QUEUE where QUEUEID = :new.ustype;--登记日期 = 数据库系统日期+1
end;
elsif dENROLDATE = newDate + 2 then
select MAXBUSIID3 +1,ENDNO into imaxID,iEndNo from QS_QUEUE where QUEUEID = :new.ustype;--登记日期 = 数据库系统日期+2
else
return;
end if;
--如果当前排队号大于最大排序号,退出
if imaxId <>0 and imaxID > iEndNo then
return;
end if; if inserting then
begin
--获得当前队列最大号,并更新队列表中最大值
if dENROLDATE = newDate then
begin
select MAXBUSIID into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID = MAXBUSIID +1 where QUEUEID = :new.ustype;
end;
elsif dENROLDATE = newDate + 1 then
begin
select MAXBUSIID2 into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID2 = MAXBUSIID2 +1 where QUEUEID = :new.ustype;
end;
elsif dENROLDATE = newDate + 2 then
begin
select MAXBUSIID3 into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID3 = MAXBUSIID3 +1 where QUEUEID = :new.ustype;
end;
end if;
--数据插入叫号业务表
select to_date(enroldate || ' ' || enroltime, 'YYYY-MM-DD HH24:MI:SS') into dENROLDATE
from us_studies where studyid= iStudyid; --登记时间 insert into QS_QUEUEBUSINESS (BUSINESSID,QUEUEID,PATNAME,PATID,STUDYID,HISID,ENROLDATE,STATUS, Sortno,CLINSINPAT,partofcheck
,Photono,Sex,Age,Totalfee,Lodgesection, Lodgedoctor,Birthdate)
values(sBUSINESSID,iQUEUEID, sPATNAME,iPATID,iSTUDYID,sHISID,dENROLDATE,sSTATUS,sBUSINESSID,sClinsitPat,sPartOfCheck
,sPhotono,sSex,sAge,iTotalfee,sLodgesection,slodgeDoctor,dBirth);
end; elsif updating then
begin
--获得当前患者的旧的队列号
select queueid into iOldQueueID from QS_QUEUEBUSINESS where studyid = :old.id;
--如果更改了队列,则重新生成排队号
if iQueueid <> iOldQueueID then
begin
if dENROLDATE = newDate then
begin
select MAXBUSIID into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID = MAXBUSIID +1 where QUEUEID = :new.ustype;
end;
elsif dENROLDATE = newDate + 1 then
begin
select MAXBUSIID2 into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID2 = MAXBUSIID2 +1 where QUEUEID = :new.ustype;
end;
elsif dENROLDATE = newDate + 2 then
begin
select MAXBUSIID3 into sBUSINESSID from QS_QUEUE where QUEUEID=:new.ustype;
update QS_QUEUE set MAXBUSIID3 = MAXBUSIID3 +1 where QUEUEID = :new.ustype;
end;
end if;
end;
else
begin
select businessid into sBusinessId from qs_queuebusiness where studyid =:old.id;
select Sortno into iSortno from qs_queuebusiness where studyid =:old.id;--2009-10-13增加过号
end;
end if; select name,HisID into sPATNAME,sHISID from us_patient where patientid= :new.Patientid;--患者姓名、HISID
update QS_QUEUEBUSINESS set BUSINESSID=sBUSINESSID,SortNo=sBUSINESSID, QUEUEID = :new.ustype, PATNAME = sPATNAME where STUDYID = :old.id;
end;
end if; end INS_QS_US_Type;
Oracle 触发器学习笔记一的更多相关文章
- Oracle基础学习笔记
Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...
- Oracle RAC学习笔记:基本概念及入门
Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章] oracle 10g real applica ...
- Oracle RAC学习笔记01-集群理论
Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...
- Oracle RAC学习笔记02-RAC维护工具集
Oracle RAC学习笔记02-RAC维护工具集 RAC维护工具集 1.节点层 2.网络层 3.集群层 4.应用层 本文实验环境: 10.2.0.5 Clusterware + RAC 11.2.0 ...
- [Oracle]OWI学习笔记--001
[Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:过程、函数、触发器和包
create procedure pro_insertDept is begin ,'市场拓展部','JILIN'); --插入数据记录 commit; --提交数据 dbms_output.put_ ...
- Oracle cursor学习笔记
目录 一.oracle库缓存 1.1.库缓存简介 1.2.相关概念 1.3.库缓存结构 1.4.sql执行过程简介 二.oracle cursor 2.1.cursor分类 2.2.shared cu ...
- oracle 触发器学习
触发器使用教程和命名规范 目 录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEA ...
随机推荐
- 经典MapReduce作业和Yarn上MapReduce作业运行机制
一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...
- 记一次排查mysql数据库连接未关闭问题的过程
在一些项目中由于一些特殊原因仍然保留着显示的获取数据库连接(Connection).提交事务.回滚事务.关闭连接等操作:其中关闭连接是比较容易疏忽又比较难在前期发现的问题. 我是如何排查连接未关闭的问 ...
- c++ 调试信息输出
1. 把打印信息输出到指定的文件里. #include <stdio.h> #include <stdlib.h> freopen("log.txt", & ...
- Redis4.0新特性 -Lazy Free
Redis4.0新增了非常实用的lazy free特性,从根本上解决Big Key(主要指定元素较多集合类型Key)删除的风险.笔者在redis运维中也遇过几次Big Key删除带来可用性和性能故障. ...
- vue定义global.js,挂载在vue原型上面使用
首先在src目录下创建global目录,在global目录下创建index.js. export default { install(Vue) { var that = this // 1. 添加全局 ...
- Git安装以及配置SSH Key——Windows
安装 安装 Git 官网下载一个Windows版本的Git. 然后一直下一步即可,如下图 环境变量自动配好的,可以去检查一下环境变量中PATH中有没有Git的环境变量 然后在桌面右击鼠标,选择Git ...
- SolidWorks学习笔记8 包覆,圆顶
包覆 在该平面上创建草图,点击A,创建文字 在左侧取消勾选“使用文档字体”,点击字体,重新设置高度,字体. 在草图上点击来放置. 点击特征->包覆, 在模型树中选择有文字的草图 这里面 选择圆柱 ...
- day31 socket套接字编程
为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...
- 人渣给我笔记本网络适配器里加的的“bluetooth设备(个人局域网)”,卸载不掉
- Kafka如何实现每秒上百万的高并发写入
Kafka是高吞吐低延迟的高并发.高性能的消息中间件,在大数据领域有极为广泛的运用.配置良好的Kafka集群甚至可以做到每秒几十万.上百万的超高并发写入. 那么Kafka到底是如何做到这么高的吞吐量和 ...