装载注明:http://yuexiaodong.iteye.com/blog/1891589
总是有这样的需求,当更新某个表的某条记录,然后需要对该表的某个字段进行更新,通过使用触发器即可完成这项工作。具体思路就是:首先建立一个临时表,然后在行触发器中记录当前操作的记录,然后在语句触发器中更新当前表。这样做的原因是,oracle对行触发器进行了限制,不能对当前表操作(具体如下:删除的行触发器不允许任何DDL操作,插入的行触发器允许通过游标读取数,这些都是我个人认为,欢迎指正!),但语句级触发器又不能获取当前增加或删除的记录,所以使用两类触发器。网上说可以使用自治事务,个人实验一把,没有达到我的目的,后来想想自治事务跟主事务独立,数据应该不是实时的,暂时放弃使用。
需求简介:对A表添加一个记录,根据表中某个字段的count(*)更新该新记录的某个字段属性值;删除某条记录,更新某个属性值;
源码如下:
---建立临时表 CREATE GLOBAL TEMPORARY TABLE ttt_Insprofworkty_insert ( id NUMBER(10,0), workid NUMBER(10,0), worktypeid NUMBER(10,0), projectid NUMBER(10,0), ordervalue NUMBER(10,0) ); CREATE GLOBAL TEMPORARY TABLE ttt_Delprofworktype_delete ( id NUMBER(10,0), workid NUMBER(10,0), worktypeid NUMBER(10,0), projectid NUMBER(10,0), ordervalue NUMBER(10,0) );
create or replace trigger profworktype_delete before delete on profworktype FOR EACH ROW -- 完成与删除的相同workid且大于当前删除ordervalue的操作 DECLARE begin insert into ttt_Delprofworktype_delete values (:old.id,:old.workid,:old.worktypeid,:old.projectid,:old.ordervalue); end; ------------------------------------ create or replace trigger profworktype_insert before insert on profworktype FOR EACH ROW DECLARE BEGIN select S_profworktype.NEXTVAL INTO :new.id from dual; insert into ttt_insprofworkty_insert values(:new.id,:new.workid,:new.worktypeid,:new.projectid,:new.ordervalue); END;
--------------------------------- 语句触发器完成业务 create or replace trigger profworktype_statement after delete or insert on profworktype -- 完成与删除的相同workid且大于当前删除ordervalue的操作 DECLARE v_count NUMBER(10,0); cursor cur_del is select * from ttt_Delprofworktype_delete deleted; cursor cur_ins is select * from ttt_Insprofworkty_insert inserted; begin if deleting then begin for i in cur_del loop begin -- dbms_output.put_line('-------'||i.ordervalue); update profworktype set ordervalue = ordervalue -1 where workid = i.workid and ordervalue > i.ordervalue ; end ; end loop; delete from Ttt_Delprofworktype_Delete; end ; end if; ----- if inserting then begin for i in cur_ins loop begin v_count := 0; select count(*) INTO v_count from profworktype where ordervalue is not null and workid = i.workid; update profworktype set ordervalue = v_count+1 where id =i.id; end ; end loop; delete from ttt_Insprofworkty_insert; end ; end if; end;
相关推荐
1、行级触发器不支持 ...所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据保存到 package中,然后在语句级触发期中调用 package包中保存的数据,进行更新操作
### Oracle触发器详解 在Oracle数据库管理中,触发器是一种非常强大的工具,它允许你在特定的数据库事件(如数据插入、更新或删除)发生时自动执行预定义的SQL语句或PL/SQL代码块。这使得数据库能够在无需外部程序...
### Oracle触发器调用存储过程 #### 知识点概览 1. **触发器基本概念** 2. **存储过程简介** 3. **触发器如何调用存储过程** 4. **示例代码详解** 5. **注意事项** 6. **自主事务(Autonomous Transaction)** 7. ...
Oracle触发器是数据库中的一个重要组成部分,它们允许开发者在特定的数据操作发生时执行自定义的PL/SQL代码。在Oracle数据库中,触发器主要分为三类:INSERT、UPDATE和DELETE,分别对应于数据插入、更新和删除时的...
Oracle触发器是数据库对象,用于在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一段PL/SQL代码。触发器可以帮助实现业务规则、数据验证和审计功能。以下是一些实例,详细解释了如何创建和使用Oracle...
- 将当前登录用户的用户名(`user`)、客户端IP地址(`sys_context('userenv','ip_address')`)以及当前日期(`sysdate`)插入到`logon_table`表中。 ```sql SQL> create or replace trigger logon_trigger 2 after ...
另一个是针对`tbname`表的列`columnname`更新后的触发器,定义了一个游标`cr`来获取特定用户名的密码信息。 总结来说,这个Oracle创建触发器的实例展示了如何使用触发器进行权限控制和日志记录,同时提供了关于如何...
Oracle8i引入了新的功能,允许从SQL语句中调用函数,但这种调用有特定限制,比如函数不能读取或修改由当前DML语句操作的表,但可以操作其他表。 总的来说,Oracle的触发器和包是强大的数据库编程工具,它们可以帮助...
Oracle触发器是一种特殊类型的存储过程,它在满足特定条件时自动执行。触发器可以与数据库表相关联,在执行DML(数据操纵语言,包括INSERT、UPDATE、DELETE)操作前、后或者代替这些操作时触发。本篇文章详细介绍了...
### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...
Oracle触发器是数据库对象,它是一种在特定事件发生时自动执行的存储过程。触发器的执行无需用户显式调用,而是由数据库系统在特定事件(如DML操作或DDL操作)触发时隐式运行。触发器由三部分组成:触发条件(即触发...
Oracle Form 触发器的执行顺序 Oracle Form 是 Oracle E-Business Suite R12 中的一个功能强大且灵活的开发工具,用于创建复杂的商业应用程序。其中,触发器(Trigger)是一种非常重要的组件,它可以根据不同的事件...
总结来说,这个Oracle监控表变动触发器例子是通过创建一个触发器来实时捕获对`test_table`的DML操作,并将这些操作的信息存入历史表`test_table_h`。这种方法可以有效地跟踪数据的变动,确保数据完整性,并且有助于...
【Oracle触发器实现临床用药目录分级提示】 在临床医疗领域,合理用药是保障患者安全、提高医疗服务质量和控制医疗费用的重要环节。随着医疗保险制度的普及,如何避免医保范围外的不合理用药,成为医疗机构面临的...
Oracle还提供了`CHECK`约束,用于在插入或更新表中的数据时检查数据的有效性,而触发器可以用来执行更为复杂的数据完整性检查。 在SQL Server环境中,触发器的概念与Oracle类似,但在语法和一些触发器特有的功能上...
Oracle触发器在税务MIS开发中扮演着至关重要的角色,主要应用于数据完整性的维护、分布式删除操作、数据冗余管理以及动态数据处理。在税务信息管理系统(MIS)的开发中,通常会遇到数据一致性、批量删除和实时信息...
在深入探讨ORACLE触发器语法之前,我们先来理解一下触发器的基本概念。触发器是数据库中的一个存储过程,它会在特定的事件(如数据插入、更新或删除)发生时自动执行。ORACLE触发器是一种强大的工具,允许数据库管理...