pl/sql中的oracle触发器

9q78igpj  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(440)

给出了两个表:
1)

employee(eno,ename,basic,da,gross)
da=basic*(5.0/100)
gross = basic+da
sal_hist(eno, sys_dt, old_basic)

如何编写触发器来更新 'da' 以及 'gross' 每当我更新员工的基本工资时?

qni6mghb

qni6mghb1#

PL/SQL 标记建议您使用oracle数据库。
你说还有一张table, sal_hist ,但是-你没说怎么处理。我想你应该把原来的基本工资存起来。
在这种情况下,触发器如下所示:

SQL> create or replace trigger trg_biu_emp
  2    before insert or update on employee
  3    for each row
  4  begin
  5    insert into sal_hist(eno, sys_dt, old_basic) values
  6      (:new.eno, sysdate, :old.basic);
  7
  8    :new.da := :new.basic * 5 / 100;
  9    :new.gross := :new.basic + :new.da;
 10  end;
 11  /

Trigger created.

让我们看看它是如何工作的:

SQL> select * From employee;

       ENO ENAME      BASIC         DA      GROSS
---------- ----- ---------- ---------- ----------
         1 Scott        100          0          0
         2 Tiger        500          0          0

SQL> select * From sal_hist;

no rows selected

SQL> update employee set basic = 200 where eno = 1;

1 row updated.

SQL> insert into employee (eno, ename, basic) values (3, 'King', 1000);

1 row created.

SQL> select * From employee;

       ENO ENAME      BASIC         DA      GROSS
---------- ----- ---------- ---------- ----------
         1 Scott        200         10        210
         2 Tiger        500          0          0
         3 King        1000         50       1050

SQL> select * From sal_hist;

       ENO SYS_DT               OLD_BASIC
---------- ------------------- ----------
         1 06.06.2020 11:10:49        100
         3 06.06.2020 11:12:07

SQL>
wd2eg0qa

wd2eg0qa2#

CREATE  DEFINER=`root`@`localhost` TRIGGER `TRIGGERNAME` AFTER UPDATE ON `employee` FOR EACH ROW 

BEGIN

SET employee.da = employee.basic*(5.0/100)
SET employee.gross = employee.basic + (employee.basic*(5.0/100))

END
lxkprmvk

lxkprmvk3#

定义da和gross的方法是直接从基中导出的。但是作为一个标准列,我可以直接更新它们中的任何一个。如果不需要这样做,那么可以将它们声明为虚拟列。

alter table employee drop (da, gross); 

alter table employee add ( 
                  da    generated always  as base * 0.05 virtual
                , gross generated always  as base * 1.05 virtual 
                );

现在这两个列都不能单独更新,并且在更新base时都会自动更新。将它们用作select的普通列,但在insert或update中不引用then。而且不需要触发器。
看小提琴。注意:您没有指定您使用的oracle版本。这需要11gr1或更高。

相关问题