0

プログラムは、パッケージ数を作成することです。組織の場所に応じて従業員が取得した休暇の数。例 :- XYZ という会社が多くの場所にある会社の場合、各場所には独自のルール セットがあります...場所によっては土曜日が勤務で、土曜日と日曜日の両方が休日と見なされる場所もあります。私は次のようにパッケージを作成しましたが、もっと簡単にできると思います。

Create or replace package Body
Leave_location
Procedure Leave_location_proc(Person_id number,
                              Start_date Date
                              )
as 
k Number;
count_weekend number;

Cursor c_var
is 
select pt.person_id,
lt.end_date-lt.start_date Number_of_leaves_excluding_the_end_date,
lt.Start_date      //Start leave date,
lt.Saturday      // 1 if saturday is not working, null if working 
lt.Sunday          ,
loc.location_id
from person_table pt,
leave_table lt
and leave_table.person_id=person_table.person_id
and loc.location_id=pt.person_id \\filtering the location for the particular employee;
Begin

Count_weekend :=0;
       for cursor_var in c_var
       k :=cursor_var.Number_of_leaves_excluding_the_end_date+1
       loop
         for i in..k
         loop
          if(to_char(cursor_var.start_date,'DY') in ('Sat','Sun')
          Then
          if(cursor_var.Saturday is not null and cursor_var.sunday is not null))
          Then
          Count_weekend :=2;
          Else
          count_weekend :=1;
          end if ;
          end if;
       cursor_var.Start_date :=cursor_var.Start_date+1;
No_of_leaves :=K-Count_weekends;
Count_weekends:=Count_weekends+1;
end loop;
end loop;

End Leave_location;
Leave_location_proc;

このコードは効率的ではないようです。もっと良い方法

4

1 に答える 1

0

これには PL/SQL は必要ありません。これが私が提案するものです-これはカーソルに変換できるクエリのみです。クエリで必要なすべてを計算できます。次に、必要に応じてカーソルで使用できます。

-- calculate values from inner/main query
SELECT all_needed_columns_from_inner_query
    , (Number_of_leaves_excluding_the_end_date - nbr_of_wkends) whatever_count
  FROM
 ( -- your main query --
  SELECT ...
       , lt.end_date-lt.start_date Number_of_leaves_excluding_the_end_date
       , (CASE WHEN lt.Saturday IS NOT NULL AND lt.Sunday IS NOT NULL THEN 2 ELSE 1) nbr_of_wkends
    ...
 WHERE...
 )

さらにヘルプが必要な場合は、サンプル データを投稿してください。ただし、上記の例では、明確な方向性とアイデアが得られるはずです。CASE を使用して、必要なすべての値を計算してください。なんらかの理由でSQLで絶対に計算できない値のみをPL/SQLで計算します...

于 2013-02-26T18:11:56.030 に答える