这个触发器该怎么写,高手请进

chenyao023 2012-07-31 09:04:35
tb1:
部门 权重 姓名

部门A 10 张三
部门A 20 李四
部门B 60 陈七
部门B 70 刘八
部门C 95 赵九

在tb1建触发器,每入一条记录时判断同部门里姓名的权重,若权重超过最大 则将姓名插入(或更新)tb2
如:insert into tb1 values('部门A',35,'王五');
insert into tb1 values('部门C',10,'李明');
insert into tb1 values('部门D',20,'王强');

要得到的结果(tb2始终为各部门权重最大者):
tb2:

部门 姓名
部门A 王五
部门B 刘八
部门C 赵九
部门D 王强
...全文
240 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gangma2 2014-04-01
  • 打赏
  • 举报
回复
create or replace trigger tb1_operate
before insert on tb1
for each row
declare
v_weight number;
v_count number;
begin
select max(权重) into v_weight from tb1 where 部门 = :new.部门;
select count(*) into v_count from tb1 where 部门 = :new.部门;
if v_count = 0 then
insert into tb2 (部门, 姓名) values (:new.部门, :new.姓名);
elsif v_weight < :new.权重 then
update tb2 set 姓名 = :new.姓名 where 部门 = :new.部门;
end if;
end;

ORAClE SE 2012-08-02
  • 打赏
  • 举报
回复


CREATE OR REPLACE TRIGGER Tb1_Trg AFTER INSERT OR UPDATE OR DELETE ON Tb1
FOR EACH ROW
DECLARE
pragma AUTONOMOUS_TRANSACTION;
BEGIN
---插入tb1中多出的部门数据,并且是qz最大的数据
INSERT INTO Tb2
SELECT Dname, NAME
FROM Tb1 a
WHERE (a.Qz, Dname) IN
(SELECT MAX(Qz), Dname FROM Tb1 GROUP BY Dname)
AND NOT EXISTS
(SELECT 1 FROM Tb2 b WHERE a.Dname = b.Dname);
COMMIT;
---更新tb1每个部门最大值对应的数据到tb2中
UPDATE Tb2 b
SET (b.Dname, b.NAME) = (SELECT a.Dname, a.NAME
FROM Tb1 a
WHERE (a.Qz, a.Dname) IN
(SELECT MAX(c.Qz), Dname
FROM Tb1 c
GROUP BY c.Dname)
AND a.Dname = b.Dname);
--子查询求得tb1每个部门最大值对应的部门,名称
COMMIT;
END;
chenyao023 2012-08-01
  • 打赏
  • 举报
回复
LS的执行会报ora-04091的错
潇洒王子 2012-08-01
  • 打赏
  • 举报
回复
elsif v_cou=0 then
人生无悔 2012-08-01
  • 打赏
  • 举报
回复

--沒有錯噢,是不是你還有其他限制,給你看結果,不過我這是繁體
SQL> insert into tb1 values('部門A',35,'王五');

已建立 1 個資料列.

SQL> insert into tb1 values('部門C',10,'李明');

已建立 1 個資料列.

SQL> insert into tb1 values('部門C',20,'王強');

已建立 1 個資料列.

SQL> insert into tb1 values('部門D',20,'劉八');

已建立 1 個資料列.

SQL> commit;

確認完成.

SQL> select * from tb1;

部門 權重 姓名
-------------------- ---------- --------------------
部門A 35 王五
部門C 10 李明
部門C 20 王強
部門D 20 劉八

SQL> select * from tb2;

部門 姓名
-------------------- --------------------
部門A 王五
部門C 王強
部門D 劉八
人生无悔 2012-07-31
  • 打赏
  • 举报
回复

--又是体力活,呵呵
create or replace trigger tb1_insupd
before insert
on tb1
for each row
declare
v_cou int := 0;
v_cou1 int := 0;
v_power int := 0;
begin
select count(1) into v_cou from tb2 where 部门=:new.部门;
select count(1) into v_cou1 from tb1 where 部门=:new.部门;
if v_cou1<>0 then
select max(权重) into v_power from tb1 where 部门=:new.部门 group by 部门;
end if;
if v_cou<>0 and v_power<:new.权重 then
update tb2 set 姓名=:new.姓名 where tb2.部门=:new.部门;
elsif v_cou=0 then
insert into tb2 values(:new.部门,:new.姓名);
end if;
end;
/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧