【发布时间】:2014-04-22 13:49:10
【问题描述】:
我对 PL/SQL 编程非常陌生,但在解决这个问题时遇到了问题:
问题陈述:
→ EMPLOYEE_PAY 表有列(ID、NAME、LOCATION、BASIC_SALARY、NET_SALARY)。
公司的政策是所有员工的基本工资相同,但净工资会根据员工的表现而变化。因此,基本工资列必须始终具有相同的值。要求是
- 如果员工的基本工资被插入或更新更改,则 基本工资栏应假定新值为主值 并且该栏将更新为最新的基本工资。
- 当基本工资列更新时,净工资的值 对于每个员工也应该相应地更新在主要 表。
净工资可以更新为-
新净薪=新底薪*(旧净薪/旧底薪)
例如:
EMPLOYEE TABLE
ID NAME LOCATION BASIC_SALARY NET_SALARY
________________________________________________ _________
12102 John Bangalore 10000 25450
12155 Rana Hyderabad 10000 24500
12154 Kejriwal New Delhi 10000 25500
12553 Narendra Patna 10000 25250
假设,如果将一个值插入到此表中或将基本工资更新为 12000,则该表应如下所示更新基本工资和净工资:
EMPLOYEE TABLE
ID NAME LOCATION BASIC_SALARY NET_SALARY
________________________________________________ ________
12102 John Bangalore 12000 30540
12155 Rana Hyderabad 12000 29400
12154 Kejriwal New Delhi 12000 30600
12553 Narendra Patna 12000 30300
12455 Sachin Mumbai 12000 30500
注意:整个过程需要在 Oracle DB 上执行,使用 PL/SQL 中的触发器。
我面临的主要问题是“如何在处理一条记录时使用触发器更改以前的记录值?” - 因为“触发器一次只处理一行”(根据我目前对触发器的了解)
到目前为止,我已经厌倦了这样做的代码如下。
CREATE TABLE EMPLOYEE_PAY(
ID INT NOT NULL,
NAME VARCHAR(20),
LOCATION CHAR(25),
BASIC_SALARY DECIMAL(18,2),
NET_SALARY DECIMAL(18,2),
PRIMARY KEY(ID)
);
CREATE OR REPLACE TRIGGER EMPLOYEE_BASIC_PAY
BEFORE INSERT ON EMPLOYEE_PAY
FOR EACH ROW
BEGIN
UPDATE EMPLOYEE_PAY
SET BASIC_SALARY = :NEW.BASIC_SALARY
WHERE BASIC_SALARY != :NEW.BASIC_SALARY;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
CREATE OR REPLACE TRIGGER EMPLOYEE_NET_PAY
BEFORE UPDATE OF BASIC_SALARY ON EMPLOYEE_PAY
FOR EACH ROW
BEGIN
UPDATE EMPLOYEE_PAY
SET NET_SALARY = :NEW.BASIC_SALARY * (:OLD.NET_SALARY/:OLD.BASIC_SALARY)
WHERE BASIC_SALARY != :NEW.BASIC_SALARY;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
当我尝试这个时,结果集中的基本工资只更新了INSERT INTO,而净工资保持不变。请尽快帮我找出可能的解决方案。
谢谢
【问题讨论】:
-
您的数据库模型存在根本缺陷。这不是你应该这样做的方式。