该程序是创建一个包计数为否。根据组织的位置由雇员采取的叶子。 例如: - 如果公司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;
这段代码看起来效率不高。任何更好的方法
答案 0 :(得分: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来计算你需要的所有值。在PL / SQL中只计算那些因任何原因无法在SQL中计算的值......