📜  PostgreSQL –函数重载

📅  最后修改于: 2022-05-13 01:57:15.185000             🧑  作者: Mango

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');

这将导致以下结果: