2012-05-02 69 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);