【发布时间】:2018-11-14 22:31:20
【问题描述】:
考虑以下两个函数,它们返回客户租用的电影数量。第二个重载第一个,并且有两个参数来指定应该租用电影的范围。
FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER;
FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE, end_date_in IN DATE)
RETURN INTEGER;
为了减少代码重复,我想从第一个函数中调用第二个函数。对于 end_date_in 我可以传递 SYSDATE 但是否有 Oracle 函数可以传递 begin_date_in 的最小可能日期( 在下面的代码中)而不查询 CUSTOMER 表?
FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER IS
BEGIN
RETURN GetFilmCount(customer_id_in, <> ,SYSDATE);
END;
【问题讨论】:
-
甲骨文中有一个绝对“最早”的日期(公元前,几千年前)。但是对于这个应用程序,你为什么需要它?你肯定在 1300 年没有任何租金,是吗?所以使用 1300 年 1 月 1 日作为默认的 begin_date。
-
顺便说一句,你不需要两个函数。您可以通过为第二个函数的第二个和第三个参数提供默认值来使它们成为可选参数。然后,如果仅使用一个参数调用该函数,则将调用相同的(second)函数,默认为 begin_date 和 end_date。
-
我会使用
NULL而不是“最小可能日期” -
你只需要一个函数,例如:
FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE DEFAULT NULL, end_date_in IN DATE DEFAULT SYSDATE) RETURN INTEGER;