Sql 使用触发器的计算

Sql 使用触发器的计算,sql,database,oracle,Sql,Database,Oracle,当表格时间表被批准时,应触发一个触发器,该触发器将计算应付工资标准时数的付款和任何加班工资标准时数的付款=表格工资上上周的标准时数X 1.5 它还应计算养老金缴款工资总额_pension*=标准+到期时间的10%,然后更新工资表,计算出下一个工资id 请注意*用于指出表属性的名称。正在使用/受影响的表格为funtom_时间表和funtom_工资单 到目前为止,我有下面的代码。但是,我不断发现错误的变量绑定: LINE/COL ERROR -------- --------------------

当表格时间表被批准时,应触发一个触发器,该触发器将计算应付工资标准时数的付款和任何加班工资标准时数的付款=表格工资上上周的标准时数X 1.5

它还应计算养老金缴款工资总额_pension*=标准+到期时间的10%,然后更新工资表,计算出下一个工资id

请注意*用于指出表属性的名称。正在使用/受影响的表格为funtom_时间表和funtom_工资单

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

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'
41/1     PLS-00049: bad bind variable 'NEW.PAYROLL_ID'
SQL>
这是触发代码

CREATE OR REPLACE TRIGGER trg_PAYROLLCALC
After UPDATE
on funtom_Timesheet FOR EACH ROW

Declare
V_TimesheetHRS number;
V_GRADEHRS number;
V_TimesheetOT number;
v_OTGRADEHRS number;
v_payrollID number;

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 funtom_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;
/

错误是因为:new。是funtom_时间表中新行的可读引用,该新行的更新导致触发此触发器。更新funtom_Payroll命令需要funtom_Payroll表中您所引用位置的字段名:new。在此update语句中,可以在“=”之后引用“:new”和“:old”,但可能不能在“=”之前引用。如果你解释一下触发器应该做什么,我可以帮助修复触发器代码。

你好!请转到学习如何提问。请发布表格的结构,不要在没有解释您实际谈论的数据的情况下写表格时间表实体等。当时间表获得批准时,应触发触发器,该触发器将计算到期标准小时的付款和该表任何加班的到期付款前一周。它还应计算到期养老金供款,然后更新工资表,计算出下一个工资表id将显示的时间表是已批准的时间表_已批准*不为空计算应付工资标准时数的付款_标准*和应付加班工资的付款_加班*=前一周的标准时数X 1.5在桌子上。它还应计算养老金缴款工资总额_pension*=标准+到期时间的10%,然后更新工资总额表,计算出下一个工资总额id。请注意*用于指出表属性的名称。正在使用/受影响的表是funtom_时间表和funtom_工资表有几件事可能是错误的。我将从第一个select查询开始。从v_gradehrs后来的使用方式来看,您似乎希望在时间表上显示员工的评分率。从Emp\U Grade=Grade\U id上的Grade join Employee中选择Grade\U rate into V\U Grade HRS,其中Emp\U id=Timesheet\U Emp;然后您可能希望它看起来像这样,虽然不知道emp_grade和grade_id在哪个表中,但很难说:在emp_grade=grade_id上选择grade_rate into V_grade HRS FROM grade join Employee,其中emp_id=:new.Timesheet_emp;接下来的三个select语句可能需要进行相同的更改。然后,update语句可能需要更改为:如果时间表_approved不为空,则将其插入funtom_工资单工资单标准、工资单加班、工资单养老金、工资单id值V_成绩小时*V_时间表、V_成绩小时*V_时间表、V_成绩小时*V_时间表+V_成绩小时*V_时间表;如果结束;错误------------------------------------------13/1 PLS-00103:遇到符号;应满足以下条件之一时:begin case declare end exit for goto if loop mod null pragma raise return select update with with with with with with