`
Peerless_
  • 浏览: 4366 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

oracle Trigger

阅读更多
create or replace trigger trigger_job_log
  after insert or update or delete on portal_job_log  
  for each row
declare
  pragma autonomous_transaction;
  v_sql             varchar2(1000);
  v_sql_ye          varchar2(1000);
  v_day             varchar2(2);
  r_bwc             PORTAL_BASE_WORKCLASS%rowtype;
  r_bwc_1           PORTAL_BASE_WORKCLASS%rowtype;
  r_bwc_2           PORTAL_BASE_WORKCLASS%rowtype;
  v_total_half_hour number default 0;
  v_total_log       number default 0;
  v_rest            number default 0;
  v_timefrom1       varchar2(20);
  v_timefrom2       varchar2(20);
  v_timeend1        varchar2(20);
  v_timeend2        varchar2(20);
  v_log_date        varchar2(20);
  v_log_date_2      varchar2(20);
  TYPE i_cursor_type IS REF CURSOR;
  job_log_cur i_cursor_type;
  v_is_work   char(1);
  row_data    portal_job_log%rowtype;
  /*  type r_record is record(
       start_time varchar2(20),
       end_time   varchar2(20),
       log_date   date
  );
  type t_table is table of r_record index by binary_integer;
  t_job_log t_table;*/
begin
  if inserting or updating then
    row_data.account    := :new.account;
    row_data.log_date   := :new.log_date;
    row_data.start_time := :new.start_time;
    row_data.end_time   := :new.end_time;
  else
    row_data.account    := :old.account;
    row_data.log_date   := :old.log_date;
    row_data.start_time := :old.start_time;
    row_data.end_time   := :old.end_time;
  end if;
  v_day        := to_number(to_char(row_data.log_date, 'dd'));
  v_log_date   := to_char(row_data.log_date, 'yyyymmdd');
  v_log_date_2 := to_char(row_data.log_date + 1, 'yyyymmdd');
  v_sql        := '
  select bwc.* from PORTAL_EMP_WORKCLASS wc join PORTAL_BASE_WORKCLASS bwc on wc.d' ||
                  v_day || ' = bwc.workid
  where wc.emp_no = ''' || row_data.account || ''' 
  and wc.year_tmp = ''' ||
                  to_char(row_data.log_date, 'yyyy') || '''
  and wc.month_tmp =''' ||
                  to_char(row_data.log_date, 'mm') || '''';
  v_sql_ye     := '
  select bwc.* from PORTAL_EMP_WORKCLASS wc join PORTAL_BASE_WORKCLASS bwc on wc.d' ||
                  (to_number(to_char(row_data.log_date - 1, 'dd'))) ||
                  ' = bwc.workid
  where wc.emp_no = ''' || row_data.account || ''' 
  and wc.year_tmp = ''' ||
                  to_char(row_data.log_date - 1, 'yyyy') || '''
  and wc.month_tmp =''' ||
                  to_char(row_data.log_date - 1, 'mm') || '''';
  begin
    execute immediate v_sql
      into r_bwc_1;
    execute immediate v_sql_ye
      into r_bwc_2;
  exception
    when others then
      goto do_now;
  end;
  -- 
  -- 
  if (r_bwc_2.timeend2 < r_bwc_2.timefrom1) and row_data.end_time < '12:00' then
    r_bwc        := r_bwc_2;
    v_log_date   := to_char(row_data.log_date - 1, 'yyyymmdd');
    v_log_date_2 := to_char(row_data.log_date, 'yyyymmdd');
    begin
      select pc.iswork
        into v_is_work
        from portal_calendar pc
       where trunc(pc.workdate) = trunc(row_data.log_date - 1)
         and pc.factoryid =
             (select decode(pu.area, 'HZGL', 'HZSZ', 'HZLH', 'HZSZ', pu.area)
                from portal_user pu
               where pu.account = row_data.account);
    exception
      when others then
        v_is_work := '0';
    end;
  else
    r_bwc := r_bwc_1;
    begin
      select pc.iswork
        into v_is_work
        from portal_calendar pc
       where trunc(pc.workdate) = trunc(row_data.log_date)
         and pc.factoryid =
             (select decode(pu.area, 'HZGL', 'HZSZ', 'HZLH', 'HZSZ', pu.area)
                from portal_user pu
               where pu.account = row_data.account);
    exception
      when others then
        v_is_work := '0';
    end;
  end if;

  if v_is_work is not null and v_is_work = '1' then
  
    if 'OT' = r_bwc.workid then
      goto do_now;
    end if;
    v_timefrom1 := r_bwc.timefrom1;
    v_timeend1  := r_bwc.timeend1;
    v_timefrom2 := r_bwc.timefrom2;
    v_timeend2  := r_bwc.timeend2;
    /* v_timeend1 := replace(v_timeend1, '00:00:00', '24:00:00');
    v_timeend2 := replace(v_timeend2, '00:00:00', '24:00:00');*/
    -- 
    if v_timeend1 < v_timefrom1 then
      v_timefrom1 := v_log_date || v_timefrom1;
      v_timeend1  := v_log_date_2 || v_timeend1;
      v_timefrom2 := v_log_date_2 || v_timefrom2;
      v_timeend2  := v_log_date_2 || v_timeend2;
      -- 
    elsif v_timefrom2 < v_timeend1 then
      v_timefrom1 := v_log_date || v_timefrom1;
      v_timeend1  := v_log_date || v_timeend1;
      v_timefrom2 := v_log_date_2 || v_timefrom2;
      v_timeend2  := v_log_date_2 || v_timeend2;
      -- 
    elsif v_timeend2 < v_timefrom2 then
      v_timefrom1 := v_log_date || v_timefrom1;
      v_timeend1  := v_log_date || v_timeend1;
      v_timefrom2 := v_log_date || v_timefrom2;
      v_timeend2  := v_log_date_2 || v_timeend2;
      -- 
    else
      v_timefrom1 := v_log_date || v_timefrom1;
      v_timeend1  := v_log_date || v_timeend1;
      v_timefrom2 := v_log_date || v_timefrom2;
      v_timeend2  := v_log_date || v_timeend2;
    end if;
  
    v_total_half_hour := (to_date(v_timeend1, 'yyyymmddhh24:mi:ss') -
                         to_date(v_timefrom1, 'yyyymmddhh24:mi:ss')) * 24 * 2 +
                         (to_date(v_timeend2, 'yyyymmddhh24:mi:ss') -
                         to_date(v_timefrom2, 'yyyymmddhh24:mi:ss')) * 24 * 2;
    v_rest            := (to_date(v_timefrom2, 'yyyymmddhh24:mi:ss') -
                         to_date(v_timeend1, 'yyyymmddhh24:mi:ss')) * 24 * 2;
    if r_bwc.timeend2 > r_bwc.timefrom1 then
      v_sql := 'select id, start_time, end_time, log_date from portal_job_log where account = ''' ||
               row_data.account ||
               ''' and to_char(log_date,''yyyymmdd'') = ''' ||
               to_char(row_data.log_date, 'yyyymmdd') || '''';
    elsif row_data.end_time < '12:00' then
      v_sql := 'select id, start_time, end_time, log_date from portal_job_log where account = ''' ||
               row_data.account ||
               ''' and ( to_char(log_date,''yyyymmdd'') = ''' ||
               to_char(row_data.log_date, 'yyyymmdd') ||
               ''' or  to_char(log_date,''yyyymmdd'') = ''' ||
               to_char(row_data.log_date - 1, 'yyyymmdd') || ''')';
    else
      v_sql := 'select id, start_time, end_time, log_date from portal_job_log where account = ''' ||
               row_data.account ||
               ''' and ( to_char(log_date,''yyyymmdd'') = ''' ||
               to_char(row_data.log_date, 'yyyymmdd') ||
               ''' or  to_char(log_date,''yyyymmdd'') = ''' ||
               to_char(row_data.log_date + 1, 'yyyymmdd') || ''')';
    end if;
  
    open job_log_cur for v_sql;
    loop
      declare
        v_start_time varchar2(20);
        v_end_time   varchar2(20);
        v_date       date;
        v_id         portal_job_log.id%type;
      begin
        fetch job_log_cur
          into v_id, v_start_time, v_end_time, v_date;
      
        if job_log_cur%NOTFOUND and (inserting or updating) then
          v_start_time := to_char(:new.log_date, 'yyyymmdd') ||
                          :new.start_time || ':00';
          if :new.end_time = '24:00' then
            v_end_time := to_char(:new.log_date + 1, 'yyyymmdd') ||
                          '00:00:00';
          else
            v_end_time := to_char(:new.log_date, 'yyyymmdd') ||
                          :new.end_time || ':00';
          end if;
        
        else
          v_start_time := to_char(v_date, 'yyyymmdd') || v_start_time ||
                          ':00';
          if v_end_time = '24:00' then
            v_end_time := to_char(v_date + 1, 'yyyymmdd') || '00:00:00';
          else
            v_end_time := to_char(v_date, 'yyyymmdd') || v_end_time ||
                          ':00';
          end if;
        
        end if;
        if deleting and :old.id = v_id then
          goto my_continue;
        end if;
        if (inserting or updating) and :new.id = v_id then
          goto my_continue;
        end if;
        if v_start_time <= v_timefrom1 then
          v_start_time := v_timefrom1;
        end if;
        if v_end_time >= v_timeend2 then
          v_end_time := v_timeend2;
        end if;
        if v_start_time >= v_timeend1 and v_start_time <= v_timefrom2 then
          v_start_time := v_timefrom2;
        end if;
        if v_end_time >= v_timeend1 and v_end_time <= v_timefrom2 then
          v_end_time := v_timeend1;
        end if;
        if v_start_time >= v_end_time then
          v_total_log := v_total_log + 0;
        else
          v_total_log := v_total_log +
                         (to_date(v_end_time, 'yyyymmddhh24:mi:ss') -
                         to_date(v_start_time, 'yyyymmddhh24:mi:ss')) * 24 * 2;
        end if;
        if v_start_time <= v_timeend1 and v_end_time >= v_timefrom2 then
          v_total_log := v_total_log - v_rest;
        end if;
        <<my_continue>>
        exit when job_log_cur%NOTFOUND;
      
      end;
    end loop;
    close job_log_cur;
  end if;
  <<do_now>>
  if v_total_log = v_total_half_hour and (inserting or updating) then
    declare
      count_ number default 0;
    begin
      select count(1)
        into count_
        from portal_day_job dj
       where dj.account = row_data.account
         and to_char(dj.log_date, 'yyyymmdd') = v_log_date;
    
      if count_ = 0 then
        insert into portal_day_job
          (id, account, log_date, is_full)
        values
          (v_log_date || row_data.account,
           row_data.account,
           to_date(v_log_date, 'yyyymmdd'),
           1);
        commit;
      end if;
    end;
  else
    delete from portal_day_job dj
     where dj.account = row_data.account
       and to_char(dj.log_date, 'yyyymmdd') = v_log_date;
    commit;
  end if;

exception
  when others then
    rollback;
    dbms_output.put_line(sqlerrm);
end trigger_job_log;

分享到:
评论

相关推荐

    Oracle Trigger

    ### Oracle触发器概念与应用详解 #### 一、引言 在现代数据库管理系统(DBMS)中,触发器是一种重要的机制,用于确保数据的完整性、安全性和一致性。Oracle数据库中的触发器功能尤其强大,允许开发人员根据不同的...

    oracle trigger(1)

    ### Oracle Trigger 概述 #### 6.1 触发器的类型 ##### 6.1.1 DML 触发器 DML (Data Manipulation Language) 触发器是一种特殊的触发器类型,它会在特定的数据操纵语言操作(如 INSERT、UPDATE 或 DELETE)执行时...

    oracle trigger at a certain time

    标题“Oracle Trigger at a Certain Time”涉及到Oracle数据库中的定时触发器,这是一种数据库对象,它可以在特定时间或事件发生时自动执行预定义的SQL语句或PL/SQL块。Oracle Trigger是数据库应用程序的重要组成...

    oracle trigger研究笔记

    这是本人为公司ERP开发人员做的trigger报告,内容全面,并比较深入,有图例说明解释,以及一些流程图例等,是学习trigger的一个很好笔记。

    Oracle_Trigger_及_Oracle_常见问题解决方法

    Oracle Trigger是数据库中的一个关键特性,它允许在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行一段PL/SQL代码。触发器通常用于实现业务规则、数据验证、审计跟踪以及保持数据的一致性。 在实例1中...

    Oracle中通过触发器来追踪用户的活动

    在Oracle数据库中,跟踪用户活动是一项重要的管理任务,有助于监控系统的使用情况、保障安全和优化性能。Oracle从Oracle8i开始引入了一类特殊触发器,它们不再局限于传统的DML事件,而是扩展到了系统级别,包括...

    Oracle Table Form Trigger

    Oracle Table Form Trigger是Oracle数据库应用开发中的重要概念,主要涉及三方面:Oracle表格(Table)、表单(Form)以及触发器(Trigger)。本篇将详细阐述这三个关键元素及其相互关系。 1. Oracle表格(Table)...

    trigger语法经典语法全

    ### Trigger语法详解 #### 一、引言 在数据库领域,触发器(Trigger)是一种特殊类型的存储过程,它被设计用于响应对特定表的数据修改操作(如INSERT、UPDATE或DELETE)。触发器能够在这些操作发生时自动执行,...

    Oracle培訓Procedure﹑Function等简介

    Oracle培訓Oracle Procedure﹑Function、Trigger等

    oracle异常及触发器.pptx

    Oracle 异常及触发器 Oracle 异常是一种运行时错误处理机制,可以捕捉和处理程序执行过程中的错误。异常可以分为预定义异常和用户定义异常两种。 预定义异常是 Oracle 提供的预定义错误类型,例如 Invalid_cursor...

    Oracle DML触发器在数据库编程中的应用.pdf

    Oracle DML 触发器在数据库编程中的应用 Oracle DML 触发器是关系型数据库系统中的一个重要组件,能够自动执行特定的操作,以响应数据库中的变化。...[4] Oracle Trigger. Oracle Corporation, 2022.

    oracleform常用Trigger的触发时机.pdf

    oracleform常用Trigger的触发时机.pdf

    使用JDeveloper开发WEB应用时同时使用Oracle的sequence和trigger

    本篇将重点介绍如何在使用JDeveloper这款强大的集成开发环境(IDE)时,结合Oracle的sequence和trigger来实现高效的数据操作。 首先,让我们理解一下sequence和trigger的概念。在Oracle中,sequence是一种自动递增...

    oracle_trigger.rar_trigger

    Oracle数据库中的触发器(Trigger)是一种数据库对象,用于在特定的数据库操作(如INSERT、UPDATE、DELETE)发生之前或之后自动执行预定义的SQL语句或PL/SQL代码块。触发器是数据库级别的事件响应机制,它允许开发...

    oracle触发器的创建与使用

    在Oracle中,查看、编辑、重命名和删除触发器同样使用类似的操作,如`SELECT * FROM USER_TRIGGERS`来查看触发器,`ALTER TRIGGER`用于编辑,`RENAME TRIGGER`用于重命名,`DROP TRIGGER`用于删除。 通过学习和掌握...

    oracle自治事务(Trigger)

    ### Oracle自治事务(Trigger)详解 #### 一、概述 Oracle数据库中的触发器是一种存储过程,它被设计为当特定事件发生时自动执行。这些事件包括数据修改操作,如INSERT、UPDATE或DELETE等。触发器可以确保数据的...

    Oracle触发器备份表数据

    在深入探讨如何利用Oracle触发器备份表数据之前,我们首先需要理解几个关键概念:Oracle数据库、触发器以及备份策略。Oracle数据库是全球领先的数据库管理系统之一,以其强大的性能、可靠的安全性和丰富的功能受到...

Global site tag (gtag.js) - Google Analytics