2015-04-25 1 views
0

Когда утверждена таблица 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.
+0

Похоже, что вам нужен формат кода немного больше. BEGIN/END;/например, проходят через текст, код узла. –

+0

Как бы вы предложили мне изменить BEGIN и END, чтобы они были распознаны как код? – Besarion

+0

Похоже, что кто-то уже сделал это за вас. –

ответ

0

Я бы настоятельно рекомендовал не писать триггеры уровня строки для большой бизнес-логики.

триггеры уровня строки могут иметь следующие проблемы

  1. Trigger будет выполняться для каждой строки, это будет очень эффективным в и замедлить работу системы.
  2. Обработка ошибок будет громоздкой, если какие-либо триггеры строки не имеют ошибок/ошибок, то ее ошибка sql update stm & сложна.
  3. Очень низкая вероятность улучшения производительности, поскольку триггер запускается на уровне строки.
  4. Другие разработчики НЕ смогли найти наличие триггера.
  5. Очень сложно улучшить или отладить позже.
  6. Триггеры трудно проверить самостоятельно

реализовать в процедуре таблицы объединения логически, не делать построчно имеют надлежащей обработки ошибок процедура процедуры тестирования независимо у вас есть свобода вызова процедуры любой части вы код, может быть, в нерабочее время.

+0

первый и последний SQL могут быть объединены SELECT, Grade_rate в V_GRADEHRS, Сумма (Grade_rate * 1.5) в v_OTGRADEHRS из класса присоединиться к Служащий на (Emp_grade = grade_id) , где emp_id = Timesheet_emp; 2. Вы можете получить проблему мутации после вашего выбора «От расписания» таблицы внутри триггера 3. Нет обработки ошибок, что, если это время выполнения ошибка выброшена из триггера , что будет с внешним запросом обновления – Ramki

+0

Спасибо Рамки для предложения, однако, это специально Trigger. Это то, что меня попросили сделать другие варианты, были упомянуты, но у них есть сердце на триггере. – Besarion

Смежные вопросы