PostgreSQL –函数重载
PostgreSQL允许多个函数具有相同的名称,只要参数不同。如果多个函数具有相同的名称,我们就说这些函数是重载的。调用函数,PostgreSQL 根据输入参数确定正在调用的确切函数。
下面我们一起来看看 get_rental_duration()函数施加到样品dvdrental作为数据库。
CREATE OR REPLACE FUNCTION get_rental_duration(p_customer_id INTEGER)
RETURNS INTEGER AS $$
DECLARE
rental_duration INTEGER;
BEGIN
-- get the rate based on film_id
SELECT INTO rental_duration SUM( EXTRACT( DAY FROM return_date - rental_date))
FROM rental
WHERE customer_id=p_customer_id;
RETURN rental_duration;
END; $$
LANGUAGE plpgsql;
这 get_rental_function接受 p_customer_id作为参数。它返回特定客户租用 DVD 的持续时间(以天为单位)的总和。例如,我们可以获取客户 ID 为278的客户的租赁时长,我们调用get_rental_duration函数如下:
SELECT get_rental_duration(278);
它返回以下内容:
假设,我们想知道客户从特定日期到现在的租赁期限。我们可以在get_rental_duration() 中再添加一个参数p_from_date 函数,或者我们可以开发一个具有相同名称但有两个参数的新函数,如下所示:
CREATE OR REPLACE FUNCTION get_rental_duration(p_customer_id INTEGER, p_from_date DATE)
RETURNS INTEGER AS $$
DECLARE
rental_duration integer;
BEGIN
-- get the rental duration based on customer_id and rental date
SELECT INTO rental_duration
SUM( EXTRACT( DAY FROM return_date + '12:00:00' - rental_date))
FROM rental
WHERE customer_id= p_customer_id AND
rental_date >= p_from_date;
RETURN rental_duration;
END; $$
LANGUAGE plpgsql;
这个函数与第一个函数同名,只是它有两个参数。我们说该函数被get_rental_duration(integer, date)函数重载。以下语句获取自2005 年 7 月 1 日以来客户 ID 为278的客户的租赁期限:
SELECT get_rental_duration(278, '2005-07-01');
这将导致以下结果: