如何使用触发器更新2个表

时间:2012-05-02 05:54:24

标签: oracle plsql triggers

我有两张桌子,

  • 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 

如果插入数据,在第二个表格中,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个表。有人可以帮助我通过触发器更新这两个表吗?

1 个答案:

答案 0 :(得分:0)

在表格上有一个before insert触发器,它将在插入之前设置记录

很少有事情需要注意:

  • 您的数据模型没有行的唯一标识符
  • 我不认为你的“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);