Oracle SQL中的触发器:当Timesheet被批准时,它应该更新工资表

时间:2015-04-25 12:05:45

标签: sql oracle triggers

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

它还应计算到期的养老金缴款(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,
  • Emp_grade是映射到Grade_id
  • 的FK
  • Timesheet_emp(FK)映射到emp_ID
  • Payroll_emp(FK)映射到emp_ID

1 个答案:

答案 0 :(得分:0)

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

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

  1. 触发器将针对每一行执行,它将非常低效并且会降低系统速度。
  2. 错误处理将是麻烦的,如果任何一个行触发器失败/错误,那么它的失败sql update stm&难以继续。
  3. 提高性能的可能性非常低,因为触发器在行级执行。
  4. 其他开发人员找不到触发器的存在。
  5. 以后很难增强或调试。
  6. 触发器难以独立测试
  7. 在程序中实施 从逻辑上连接表,不要逐行 有适当的错误处理程序 独立测试程序 您可以自由地调用程序的任何部分代码,可能是在非高峰时段。