-1

我有2张桌子,

  • lv_data,

它有以下字段,

              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

这里我需要编写触发器来更新剩余天数列,

在第一个表中emp_nametot_days是 18 天,所以在第二个表中,每当插入记录时,remaining_days应该像这样计算

remaining_days := tot_days - no_of_days 

并且这个(计算的)值应该在第一个表( )的tot_days列中更新,lv_data

示例:

        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            16 
    

现在第一个表应该像这样更新,

     emp_name tot_days 
        guru     16 

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

4

1 回答 1

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); 
于 2012-05-02T08:10:56.103 回答