-1

私は2つのテーブルを持っています、

  • 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 

2 番目のテーブルにデータが挿入されると、no_of_days自動的に計算されます。(from to_date - From_date)+1

ここで、remaining_days 列を更新するトリガーを記述する必要があります。

すべての最初のテーブルemp_nametot_daysは 18 日なので、レコードが挿入されるたびに 2 番目のテーブルでは、次の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 つのテーブルを更新する必要があります。誰かがトリガーを介してこれら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 に答える