Oracle SQL 中的触发器:时间表获得批准后,它应更新工资单表



当表Timesheet被批准(Timesheet_approved*不为空)时,应该触发一个触发器,该触发器将计算标准到期小时数(Payroll_standard*)的付款和前Payroll一周任何加班费(Payroll_overtime* = standard hours X 1.5)的应付付款。

它还应该计算到期的养老金缴款(Payroll_pension* = 10% of standard + Over time),然后更新payroll表(计算下一个payroll id是多少)

请注意*用于指出表属性的名称。正在使用/受影响的表TimesheetPayroll

到目前为止,我有下面的代码。但是,我不断收到有关错误变量绑定的错误:

LINE/COL ERROR
-------- -------------------------------------------------------------
32/3     PL/SQL: SQL Statement ignored
33/3     PL/SQL: ORA-01747: invalid user.table.column, table.column, or
     column specification
33/3     PLS-00049: bad bind variable 'NEW.PAYROLL_STANDARD'
34/3     PLS-00049: bad bind variable 'NEW.PAYROLL_OVERTIME'
35/3     PLS-00049: bad bind variable 'NEW.PAYROLL_PENSION'
SQL>

.SQL:

CREATE OR REPLACE TRIGGER trg_PAYROLLCALC
After UPDATE
on Timesheet FOR EACH ROW
Declare
V_TimesheetHRS number (3);
V_GRADEHRS number (3);
V_TimesheetOT number (3);
v_OTGRADEHRS number (3);
v_payrollID number (3);
BEGIN
SELECT Grade_rate into V_GRADEHRS
FROM Grade join Employee on (Emp_grade = grade_id)
where emp_ID = Timesheet_emp
;
SELECT Timesheet_hours into V_TimesheetHRS
From Funtom_timesheet join Funtom_employee on (emp_ID = Timesheet_emp)
where emp_ID = Timesheet_emp
;
Select Timesheet_OT into V_TimesheetOT
From Timesheet join Employee on (emp_ID = Timesheet_emp)
where emp_ID = Timesheet_emp
;
select Sum(Grade_rate * 1.5) into v_OTGRADEHRS
from Grade join Employee on (Emp_grade = grade_id)
where emp_ID = Timesheet_emp
;

IF Timesheet_approved IS NOT NULL then
    Update Payroll set
    :new.Payroll_standard := V_GRADEHRS * V_TimesheetHRS;
    :new.Payroll_overtime := v_OTGRADEHRS * V_TimesheetOT;
    :new.Payroll_pension  := ((V_GRADEHRS * V_TimesheetHRS)+(v_OTGRADEHRS * V_TimesheetOT));
END IF;
Select MAX(Payroll_id)+1 into v_payrollID
from Payroll;
:new.Payroll_id := v_payrollID;
END;
/

笔记:

  • Grade_rate是工人获得报酬的标准费率,
  • Grade_id是该速率的PK,
  • 映射到Grade_id的 FK Emp_grade
  • Timesheet_emp (FK) 映射到emp_ID
  • Payroll_emp (FK) 映射到emp_ID .

我强烈建议不要为大型业务逻辑编写行级触发器。

行级别触发器可能存在以下问题

  1. 触发器将执行每一行,它将非常低效并减慢系统速度。
  2. 错误
  3. 处理将很麻烦,如果任何一个行触发器失败/错误,那么它的失败sql更新stm和困难的继续。
  4. 提高性能的机会非常低,因为触发器在行级别执行。
  5. 其他开发人员找不到触发器的存在。
  6. 以后很难增强或调试。
  7. 触发器难以独立测试

在程序中实施逻辑连接表,不要逐行做有适当的错误处理程序独立测试程序您可以自由调用程序的任何部分,可以在非高峰时段。