Рассмотрим следующие две функции, которые возвращают количество фильмов, взятых напрокат. Второй перегружает первый и имеет еще два параметра, определяющих диапазон, в котором фильмы следует брать напрокат.
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 (<> в следующем коде) без запроса таблицы КЛИЕНТ?
FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER IS
BEGIN
RETURN GetFilmCount(customer_id_in, <> ,SYSDATE);
END;
Кстати, вам не нужны две функции. Вы можете сделать второй и третий параметры второй функции необязательными, задав им значения по умолчанию. Затем, если функция вызывается только с одним параметром, будет вызвана та же функция (второй) со значениями по умолчанию 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;





Минимальное значение переменной DATE в Oracle - 1 января 4712 г. до н.э., поэтому следующее даст вам максимальный диапазон до SYSDATE включительно:
RETURN GetFilmCount(customer_id_in, TO_DATE('01-Jan-4712 BC', 'DD-MON-YYYY BC'), SYSDATE);
Удачи.
Используйте NULL для "неопределенных" значений, а не для какого-то магического числа:
FUNCTION GetFilmCount(
customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE
)
RETURN INTEGER IS
BEGIN
RETURN GetFilmCount(customer_id_in, NULL ,SYSDATE);
END;
и
FUNCTION GetFilmCount(
customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE,
begin_date_in IN DATE,
end_date_in IN DATE
)
RETURN INTEGER IS
p_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO p_count
FROM your_table
WHERE customer_id = customer_id_in
AND ( begin_date_in IS NULL OR begin_date_in <= your_date_column )
AND ( end_date_in IS NULL OR your_date_column <= end_date_in );
RETURN p_count;
END;
В Oracle есть абсолютная «самая ранняя» дата (до н.э., несколько тысяч лет назад). Но зачем вам это приложение для этого приложения? У вас ведь в 1300 году нет арендной платы? Поэтому используйте 1 января 1300 г. в качестве значения по умолчанию для begin_date.