Oracle Trigger如何获取Inserted value的参数

时间:2017-12-06 13:53:59

标签: oracle triggers insert

我在研究Oracle数据库的触发器时遇到了一个问题。

首先,我创建了两个表,如下所示:

**[Employee]**
(empno NUMBER, VARCHAR2 (20), deptno NUMBER, salary NUMBER)
**[Department]**
(deptno NUMBER, dname VARCHAR2 (20))

员工deptno指的是部门的deptno。

我想要创建的触发器是使用deptno计算数据的工资平均值,例如插入的deptno。

例如,假设我运行以下代码。

INSERT INTO employee values (1000, 'PAUL', 10, 4000);

然后Trigger希望得到以下输出:

Department [10]'s average of Salary = <avg (salary)>

但我不知道如何在Trigger中传递插入行的参数。

有没有人对我有好的方法?

3 个答案:

答案 0 :(得分:0)

将触发器实现为没有意义。这只是一个简单的SQL查询:

select deptno ,avg(salary)
from employee
group by deptno

答案 1 :(得分:0)

触发器不适合此类事件,但可以使用compound trigger完成:

create or replace trigger avg_dept_salary for insert on employee compound trigger

  type tb_num is table of number;
  v_depts tb_num := tb_num();
  v_sum number;

before each row is 
  begin
    if :new.deptno not member of v_depts then
      v_depts.extend();
      v_depts(v_depts.count()) := :new.deptno;
    end if;
  end before each row;

after statement is
  begin
    for i in 1..v_depts.count() loop
      select avg(salary) into v_sum from employee where deptno = v_depts(i);
      dbms_output.put_line('Department '||v_depts(i)||' average salary: '||v_sum);
    end loop;
  end after statement;

end;

测试:

insert into employee 
  select 1001, 'PAUL', 10, 1000 from dual union all
  select 1002, 'ANNE', 10, 1700 from dual union all
  select 1003, 'MARY', 10,  900 from dual union all
  select 1004, 'JOHN', 20, 1200 from dual;

每个受影响部门的输出:

Department 10 average salary: 1900
Department 20 average salary: 1200

答案 2 :(得分:0)

我意识到如果我在触发器中使用AFTER INSERT关键字,则会出现'ORA-04091'错误,因为表的内容正在发生变化。所以我发现我必须在插入之前使用才能获得结果。 这不是正确的方法,但我能够表达我想要的输出。

非常简单。在更改表之前(BEFORE INSERT Keyword),我将变量中的列的总和存储起来以获得平均值。 然后使用':NEW'关键字将新值添加到变量中。

当我使用这种方法时,我没有收到'ORA-04091'错误,因为该表仍然在更改之前。

感谢很多人,我发现这不是写入触发器的好方法。 但是,我正在考虑这个问题,并且我学到了许多内部操作,例如触发器的成本以及何时调用它们。

再次感谢所有回答者。