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创建触发器的主要内容,如果未能解决你的问题,请参考以下文章