oracle创建触发器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle创建触发器相关的知识,希望对你有一定的参考价值。

创建触发器:
create table std(deptno number(2),sal number(5));
insert into std values(20,2000);
假设std表中的信息,是部门号与该部门的平均工资。
现在要创建触发器,当在emp插入信息时,把工资低于所属部门的平均工资的职员信息插入到emp1表中
emp1表的结构与emp表一样

你说的这东西本身就不适合弄做触发器

std表是部门号与某部门的平均工资

如果往emp里插入一条记录的话,那么整个部门的平均工资就会发生变化

所以这个时候std表里的数据就不是真正的平均工资了

不知道为什么要这么做,你们老师想不开吧?

而且emp1的表结构是什么?

还有,工资低于所属部门的平均工资的职员信息插入到emp1表中?

那么难道不是每插入一个员工的话,emp1表就要插入一遍,那么emp1表里会有N
多重复数据
参考技术A Create or replace trigger "Tri_name"
before insert on emp
for each row
declare
v_wage number ;
begin
select wage into v_wage from std where deptno= :new.staff_deptno;
if v_wage>=:new.wage then
Insert into emp1(staff_id,staff_wage) values(:new.staff_id,:new.staff_wage);
end if;
End Tri_name;
参考技术B 在考虑用触发器之前还要考虑:
1.什么时候比较适合用触发器?
2.触发后的结果是否满足实际情况?
3.是否符合业务逻辑?
4.是否会产生数据冗余等?

触发器可以帮我们好多忙,但也要注意场合,不是那儿都合适的!

Oracle 触发器创建自动编号

【中文标题】Oracle 触发器创建自动编号【英文标题】:Oracle trigger to create an autonumber 【发布时间】:2012-01-09 22:42:43 【问题描述】:

我之前从未在 Oracle 中创建过触发器,所以我正在寻找方向。

我想创建一个触发器,如果​​ ID 不在插入语句中,则将 ID 加一。

ID 应该从 10000 开始,当插入一条记录时,下一个 ID 应该是 10001。如果插入语句包含一个 ID,它应该覆盖自动增量。

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')

应该看起来像:

名字姓氏ID

迈克尔·乔丹 10000

拉里伯德 10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000)

应该看起来像:

名字姓氏ID

迈克尔·乔丹 10000

拉里伯德 10001

斯科蒂·皮蓬 50000

【问题讨论】:

【参考方案1】:

我建议使用触发器本身的条件编写此触发器,而不是在 sql 块中。

CREATE OR REPLACE TRIGGER your_trigger
BEFORE INSERT ON your_table
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (new.id IS NULL)
  BEGIN
    SELECT your_sequence.nextval
    INTO :new.id
    FROM dual;
  END;
/

使用此解决方案,仅当条件匹配(id 为空)时才会执行触发器。

否则触发器总是被执行并且块检查 id 是否为空。 DB 必须执行对非空值不执行任何操作的 SQL 块。

【讨论】:

【参考方案2】:

这样的东西可以在 11g 上运行

CREATE SEQUENCE t1_id_seq 
  start with 10000 
  increment by 1;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    :new.id := t1_id_seq.nextval;
  END IF;
END;

如果您使用的是早期版本,则需要执行 SELECT INTO 以从序列中获取下一个值

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    SELECT t1_id_seq.nextval
      INTO :new.id
      FROM dual;
  END IF;
END;

请注意,Oracle 序列不是无间隙的。因此,出于各种原因,完全有可能跳过特定的值。如果在几分钟、几小时或几天后完成,您的第一个插入的 ID 可能为 10000,第二个插入的 ID 可能为 10020。

另外,请注意,Oracle 不支持在 VALUES 子句中指定多行,就像 MySQL 那样。所以而不是

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')

你需要两个单独的 INSERT 语句

insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');

【讨论】:

https://github.com/miklagard/oracle-table-creator

以上是关于oracle创建触发器的主要内容,如果未能解决你的问题,请参考以下文章

oracle创建触发器

创建 Oracle 序列触发器

Oracle 触发器创建自动编号

通过 JDBC (oracle) 创建触发器

SQL server与Oracle触发器的创建与使用

[转]ORACLE触发器详解