Oracle 存储+定时器+触发器

一、编写一个存储过程, 记录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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值