Когда утверждена таблица Timesheet
(Timesheet_approved*
- не нуль), должен срабатывать триггер, который рассчитает оплату стандартных часов (Payroll_standard*
) и оплату для любой сверхурочной работы (Payroll_overtime* = standard hours X 1.5
) за предыдущую неделю на столе Payroll
.Триггер в Oracle SQL: если протокол утвержден, он должен обновить таблицу расчета заработной платы
Необходимо также рассчитать пенсионный взнос (Payroll_pension* = 10% of standard + Over time
) из-за, а затем обновить payroll
таблицу (разработка, что следующий payroll id
будет)
Обратите внимание *
используется, чтобы указать на имена атрибутов таблицы. Используемые/поврежденные столы: Timesheet
и Payroll
До сих пор у меня есть код, указанный ниже. Тем не менее, я продолжаю получать ошибки вокруг плохой переменной привязки:
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
- это ПК этого курса,Emp_grade
является FK, который отображает наGrade_id
,Timesheet_emp
(FK) отображает наemp_ID
,Payroll_emp
(FK) отображает наemp_ID
.
Похоже, что вам нужен формат кода немного больше. BEGIN/END;/например, проходят через текст, код узла. –
Как бы вы предложили мне изменить BEGIN и END, чтобы они были распознаны как код? – Besarion
Похоже, что кто-то уже сделал это за вас. –