2012-05-02 67 views
-1

我有2个表,如何使用触发器

  • lv_data,更新2台

它具有以下字段,

   emp_name   tot_days 
       guru    18 
  • leave_data

它具有下列字段,

 emp_name From_date  to_date  no_of_days remaining_days 
      guru 02/05/2012  03/05/2012   2 

在如果该数据被插入时,no_of_days将自动计算(from to_date - From_date)+1

在这里,我需要写触发更新remaining_days列第二表,

在第一张表中,所有emp_name,tot_days为18天,因此在第二张表中,每当插入记录时,remaining_days应该像这样计算

remaining_days := tot_days - no_of_days 

而这个(计算值)的值应在第一个表(lv_datatot_days列被更新,

样品实施例:

 emp_name tot_days 
      guru  18 
  • leave_data

    emp_name  From_date to_date  no_of_days remaining_days 
    guru  02/05/2012 03/05/2012  2   16 
    

现在应该更新第一张表,

 emp_name tot_days 
     guru  16 

所以我需要更新2个表格。有人可以帮助我通过触发更新这两张表吗?

+0

你尝试过什么? –

回答

0

有一个插入前触发器在桌子上,将其插入

几点需要注意前创下的纪录:

  • 你的数据模型不具有唯一标识符的行
  • 我不认为你的“no_of_days”计算是正确的。

CREATE OR replace TRIGGER leave_data_before_insert 
    BEFORE INSERT ON LEAVE_DATA 
    FOR EACH ROW 
DECLARE 
    CURSOR c_lv_data(
     p_emp_id IN lv_data.id%TYPE) IS 
     SELECT tot_days 
     FROM lv_data 
     WHERE id = p_emp_id; 
    v_tot_days NUMBER; 
BEGIN 
    OPEN c_lv_data(:new.id); 

    FETCH c_lv_data INTO v_tot_days; 

    :new.no_of_days := (:new.from_date - :new.TO_DATE) + 1; 

    :new.remaining_days := v_tot_days - :new.no_of_days; 

    UPDATE lv_data 
    SET tot_days = :new.remaining_days 
    WHERE id = :new.id; 

    CLOSE c_lv_data; 
END; 

DDL用于测试:

CREATE TABLE lv_data 
    (
    id  NUMBER, 
    emp_name VARCHAR2(240), 
    tot_days NUMBER 
); 

CREATE TABLE leave_data 
    (
    id    NUMBER, 
    emp_name  VARCHAR2(240), 
    from_date  DATE, 
    to_date  DATE, 
    no_of_days  NUMBER, 
    remaining_days NUMBER 
); 

DML用于测试:

INSERT INTO lv_data 
VALUES  (1, 
      'sathya', 
      18); 

INSERT INTO LEAVE_DATA 
VALUES  ('1', 
      'sathya', 
      SYSDATE, 
      SYSDATE + 2, 
      NULL, 
      NULL);