我有两张桌子,
它有以下字段,
emp_name tot_days
guru 18
它有以下字段,
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
此(计算)值应在第一个表格中的tot_days
列中更新(lv_data
),
示例示例:
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)
在表格上有一个before insert触发器,它将在插入之前设置记录
很少有事情需要注意:
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);