第四章 触发器练习题答案

1、

(1)创建一张emp1的日志记录表,emp1_log,日志记录表的字段为emp1表的字段,
并且在emp1表的字段基础上添加三个字段信息elogno (日志主键),
execdesc(操作描述),操作时间(exectime)
创建序列,用来生成日志表的主键信息
create table emp1_log as select * from emp1 where 1=2; –要记住:约束 复制不下来
alter table emp1_log add (elogno number,execdesc varchar2(100),exectime date);
alter table emp1_log add constraint pk_emp1_elogno primary key (elogno);

create sequence seq_log;

(2)编写一个触发器在emp1表上,触发时机和触发事件为删除之后或者修改ename之后,
触发类型为行级触发,内容为将删除的原数据和修改的原数据记录进emp1_log表中,
并添加描述,即如果是修改操作的语句,则将描述内容记为’update’,
如果是删除语句的内容,则将描述内容记为’delete’。
要求emp1_log表中有delete和update的数据,并且记录时间。
create or replace trigger t_emp1
after delete or update of ename
on emp1
for each row
begin
—-如果是删除操作
if deleting then
insert into emp1_log(empno,ename,job,mgr,
hiredate,sal,comm,
deptno,dname,
elogno ,execdesc ,exectime)
values(:old.empno,:old.ename,:old.job,:old.mgr,
:old.hiredate,:old.sal,:old.comm,
:old.deptno,:old.dname,
seq_log.nextval ,’delete’,sysdate);
—-如果是修改语句
elsif updating then
insert into emp1_log(empno,ename,job,mgr,
hiredate,sal,comm,
deptno,dname,
elogno ,execdesc ,exectime)
values(:old.empno,:old.ename,:old.job,:old.mgr,
:old.hiredate,:old.sal,:old.comm,
:old.deptno,:old.dname,
seq_log.nextval ,’update’,sysdate);

end if;
end;
已创建好了触发器

delete from emp1 where ename=’SCOTT’;
–commit;

2、

(1)在emp1表上创建dname字段,并给该字段赋值,该字段的值取自dept表
alter table emp1 add (dname varchar2(20));

update emp1 set dname = (select dname from dept where dept.deptno=emp.deptno);

(2)创建dept表的触发器,要求更该dept表中的部门名称的同时,修改emp1表中对应编号的部门名称。
create or replace tigger t_dept
after update of dname
on dept
for each row
begin
update emp1 set dname= :new.dname where deptno = :old.deptno;
dbms_output.put_line
(‘旧的dname值是’||:old.dname||’、新的dname值是’||:new.dname);
end;

3、

用我们所学过的数据库对象操作,
要求在给emp表添加员工信息的时候,
如果添加的员工的工资大于10000则将工资改为5000,
如果添加的员工的工资小于500,则将工资改为1000.
触发器:
create or replace trigger t_emp
before insert
on emp
for each row
begin
if :new.sal>10000 then
–触发器的触发对象在内部是不能继续操作的, 故 不能用update
:new.sal:=5000;
elsif :new.sal<500 then
:new.sal:=1000;
end if;
end;
触发器已创建成功

insert into emp (empno,ename,deptno,sal)
values (1234,’张’,10,1007);

4、 可以不用触发器

(1)给emp表添加薪资等级字段,再从薪资等级表中更新该字段的内容;
alter table emp add (grade number);
update emp set grade=
(select grade from salgrade where sal between losal and hisal );

–commit;

(2)公司下发了新规定,要求每个等级的最高工资要有所上调,
每个等级的最高工资要上调200,请将接下来等级的最低工资也进行调整。
也就是说等级1的最高工资原为1200,上调后是1400,
那么等级2的最低工资要调整为1401.
for循环使用游标: 每个等级的最高最低都加200元,不太符合题意
declare
cursor c_salgrade is
select grade,losal,hisal from salgrade;
begin
for i in c_salgrade loop
update salgrade set hisal=hisal+200,losal=losal+200
where grade=i.grade;
–commit;
end loop;
end;

故需要修改:
declare
cursor c_salgrade is
select grade,losal,hisal from salgrade;
begin
for i in c_salgrade loop
update salgrade set
hisal=hisal+200,—最高工资要上调200
losal= (case i.grade
when 1 then losal –最低工资也进行调整
else losal+200 end )
where grade=i.grade;
–commit;
end loop;
end;


(3)等级工资更新完后,请更新员工表中员工的工资等级信息。
update emp e set grade=
(select grade from salgrade s where e.sal between s.losal and s.hisal);

猜你喜欢

转载自blog.csdn.net/weixin_42800008/article/details/81299723
今日推荐