0

状況 1 :

p_start_date = 13.Apr.2012 13:00
p_end_date = 13.Apr.2012 15:00

working_hours = 0

// in this Situation working_hours should be 2

状況 2 :

p_start_date = 13.Apr.2012 13:00
p_end_date = 14.Apr.2012 15:00

working_hours = 24

// in this Situation working_hours should be 26

これをSQLDevelopperと で実行するSituation 1Situation 2、 の値working_hoursが正しく返されます。Before Insert Update Triggerしかし、私は頂点アプリケーションで使用するためにこのプロシージャを呼び出します。で表形式フォームを送信するとSituation 1、 の値working_hoursがになり、 で0表形式フォームを送信するとSituation 2、 の値working_hoursがになり24ます。

Situation 1およびに従ってSituation 2、2 つの日付の差が working_hours に割り当てられます。しかし、私の必要性は、2回の差を取得することです。

どうすればそれができますか?

私の計算手順working_hours は、

PROCEDURE get_labour_cost_data(
 p_employee_id IN NUMBER,
 p_start_date IN VARCHAR2,
 p_end_date IN VARCHAR2,
 hours_normal_rate OUT NUMBER,
 working_hours OUT NUMBER,
 total_cost OUT NUMBER)

 AS

 v_employee_rate NUMBER;

 BEGIN

  if p_employee_id is null then

    hours_normal_rate := 0; 
    working_hours := 0;
    total_cost := 0;

  elsif p_employee_id is not null then

    -- Get hourse_noraml from employee
    select HOURLY_SALARY into hours_normal_rate from Employee
    where EMPLOYEE_ID = p_employee_id;

    -- Get working hours   
    working_hours := 24 * (to_date(p_end_date, 'dd.mm.rr hh24:mi') - to_date(p_start_date, 'dd.mm.rr hh24:mi'));

    -- Get Total cost   
    total_cost := nvl(hours_normal_rate,0) * nvl(working_hours,0);

    end if;    
  END;

トリガーは、

create or replace
TRIGGER LABOUR_COST_BIU_TRI 
BEFORE INSERT OR UPDATE ON LABOUR_COST 
FOR EACH ROW
DECLARE

v_hours_normal NUMBER;
v_working_hours NUMBER;
v_total_cost NUMBER;
BEGIN

    util.get_labour_cost_data(
    p_employee_id => :NEW.EMPLOYEE_ID,
    p_start_date => :NEW.START_DATE_TIME,
    p_end_date => :NEW.END_DATE_TIME,
    hours_normal_rate => v_hours_normal,
    working_hours => v_working_hours,
    total_cost => v_total_cost
  );

      select v_hours_normal, v_working_hours, v_total_cost into :NEW.HOURS_NOMAL, :NEW.HOURS_OT, :NEW.TOTAL_COST
  from dual;

END;
4

1 に答える 1

0

プロシージャを単独で作成して実行すると、次のように機能します。

declare
 hours_normal_rate NUMBER;
 working_hours NUMBER;
 total_cost NUMBER;
begin
get_labour_cost_data(
 1,
 '13.Apr.2012 13:00',
 '13.Apr.2012 15:00',
 hours_normal_rate,
 working_hours,
 total_cost);
 dbms_output.put_Line(working_hours);
END;

出力:

2

と:

declare
 hours_normal_rate NUMBER;
 working_hours NUMBER;
 total_cost NUMBER;
begin
get_labour_cost_data(
 1,
 '13.Apr.2012 13:00',
 '14.Apr.2012 15:00',
 hours_normal_rate,
 working_hours,
 total_cost);
 dbms_output.put_Line(working_hours);
END;

出力:

25.99999999999999999999999999999999999992

(近い!)

トリガーでの使用方法に問題はありませんが、次のように簡略化できます。

create or replace
TRIGGER LABOUR_COST_BIU_TRI 
BEFORE INSERT OR UPDATE ON LABOUR_COST 
FOR EACH ROW
BEGIN

    util.get_labour_cost_data(
    p_employee_id => :NEW.EMPLOYEE_ID,
    p_start_date => :NEW.START_DATE_TIME,
    p_end_date => :NEW.END_DATE_TIME,
    hours_normal_rate => :NEW.HOURS_NOMAL,
    working_hours => :NEW.HOURS_OT,
    total_cost => :NEW.TOTAL_COST
  );

END;
于 2012-04-13T09:02:28.057 に答える