编写一个存储过程, 记录emp的所有信息到新表empcp, 计算工龄和入职奖金, 再创建一个存储过程, 记录操作日志状态, 再写一个定时器, 按10秒刷新一次, (记得关闭定时器), 并且加入触发器
--创建empcp表
create table empcp(
empno number
,ename varchar2(20)
,job varchar2(30)
,mgr number
,hiredate date
,sal number
,comm number
,deptno number
,wyear number
ysal number
);
--创建操作log表
create table add_log(
i_id number
,item varchar2(256)
,status varchar2(256)
,workdate date
);
--创建存储过程, 将数据插入empcp表中, 并且调用add_log将操作记录写进日志
create or replace procedure sp_add_empcp as
cursor cur is select * from emp;
reason varchar2(256);
begin
execute immediate 'truncate table empcp'; --清空数据
for i in cur loop
insert into empcp
select
i.empno, i.ename, i.job, i.mgr, i.hiredate, i.sal, i.comm, i.deptno
,trunc(months_between(sysdate, i.hiredate)/12)
,trunc(months_between(sysdate, i.hiredate)/12) *500
from emp;
end loop;
commit;
sp_add_empcp_log('success', 'sp_add_empcp', null);
exception
when others then
reason:= sqlerrm();
sp_add_empcp_log('failures', 'sp_add_empcp', reason);
end;
--创建存储过程, 操作写入add_log日志表
create or replace procedure sp_add_empcp_log(logmsg in varchar2, logname in varchar2, reason in varchar2) as
begin
insert into add_log values(
addlog.nextval
,logname
,logmsg
,sysdate
,reason);
commit;
end;
--加入定时器job, 定时调用sp_add_empcp存储过程, (记得关闭job定时器)
declare
job_id number;
begin
dbms_job.submit(
job => job_id --自动生成定时器的id号
,what => 'sp_add_empcp;' --需要执行的存储过程名称
,next_date => sysdate + 1/(24*60) --下一个1分钟(初次执行时间)
,interval => 'sysdate + 10/(60*24*24)'); --每隔1分钟执行1次
commit;
end;
--关闭定时器
begin
dbms_job.broken(23,true,sysdate);--里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
commit;
end;
--创建trriger 对象: empcp
create or replace trigger empcp_trriger
before insert or update or delete
on empcp
begin
if to_char(sysdate, 'day') = '星期日' then
raise_application_error(-20006, '不能在星期日改变员工信息!');
end if;
end;
--测试查看数据
begin
add_empcp;
end;
select * from empcp;
select * from add_log;
select * from all_jobs;
--定时器内容
--2)手动执行job
begin
dbms_job.run(83); /*23 job的id*/
commit;
end;
--3)删除job
begin
dbms_job.remove(83); /*23 job的id*/
commit;
end;
--4)停止job true false 启动job ,
begin
dbms_job.broken(83,true,sysdate); --里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
commit;
end;
--5)修改间隔时间
begin
dbms_job.interval(83, 'SYSDATE + 10/(60*24*60)');
commit;
end;
--6)修改下次执行时间
begin
dbms_job.next_date(83,sysdate+5/(24*60*60));
commit;
end;
--7)修改要执行的操作
begin
dbms_job.what(83,'sp_fact_charge_code;'); --修改某个job名
commit;
end;