问题内容如下。创建一个名为FIND_DISCOUNT的过程,该过程接收作为输入参数预订的席位数,并通过输出参数返回折扣百分比。使用折扣表来检索折扣百分比。 表格如下;两列三行。第一栏:10 20 30.第二栏:15 20 25。
现在我可以创建一个程序来简单地检查第一列并在第二列中返回金额,但我必须考虑到座位数不是固定值,例如:23这意味着它没有直接列在该表虽然超过20但不到30,所以折扣百分比为20%。我没有问题硬编码值和使用if语句来查找输出,但问题清楚地表明使用表格,我遇到了一个解决方案,它接受输入参数并将其与表中的多个值进行比较
请帮助我可以在必要时发布更多信息,我不是要求任何人给我一个解决方案,而只是告诉我应该如何思考。 提前谢谢。
答案 0 :(得分:1)
如果座位数在折扣表中,那么您可以使用诸如
之类的查询获得折扣百分比SELECT discount_percentage
INTO v_discount_percentage
FROM your_table
WHERE number_of_seats = p_number_of_seats;
此处,p_number_of_seats
是席位数,可能是传递给过程的参数,而v_discount_percentage
是一个保留返回折扣百分比的局部变量。
但是,如果座位数不在表中怎么办?在这种情况下,您希望将席位数向下舍入到表中的下一个值。从本质上讲,您要查找的席位数是number_of_seats
列中不超过p_number_of_seats
的最大值。
我建议使用两个查询:
number_of_seats
中的最大值不超过p_number_of_seats
。请注意处理座位数太小而无法应用任何折扣的情况。
答案 1 :(得分:0)
试一试,解决方案太简单了。
折扣表:
COLUMN1 COLUMN2
======= =======
10 15
20 20
30 25
create or replace procedure FIND_DISCOUNT(p_booked_seats in number,
p_discount out number) is
cursor cur_discount is
select column1, column2 from discount order by 1 ;
begin
p_discount := 0;
for rec in cur_discount loop
if p_booked_seats >= rec.column1 then
p_discount := rec.column2;
end if;
end loop;
end;
begin
-- Call the procedure
find_discount(p_booked_seats => :p_booked_seats,
p_discount => :p_discount);
end;