PostgreSQL 教程: 带 INOUT 参数的存储过程

五月 23, 2024

摘要:在本教程中,您将学习如何创建带INOUT参数的 PostgreSQL 存储过程。

目录

创建带 INOUT 参数的存储过程

有时,您可能希望从存储过程返回值。要实现这一点,您可以使用带有INOUT参数的create procedure语句。

下面是创建带有INOUT参数的存储过程的基本语法:

create or replace procedure sp_name(
    inout parameter type, ...
)
as
$$
   -- body
$$
language plpgsql;

调用带 INOUT 参数的存储过程

要调用一个存储过程,可以使用call语句,而不用提供INOUT参数:

call sp_name();

如果在匿名块中调用带有INOUT参数的存储过程,则需要向存储过程调用传递参数,如下所示:

do
$$
   declare 
      v_name1 type;
      v_name2 type;
   begin
      -- call the stored procedure with inout parameters
      call sp_name(v_name1, v_name2);

      -- process v_name1, v_name2
   end;
$$;

带有 INOUT 参数的 PostgreSQL 存储过程示例

让我们举一些使用INOUT参数创建存储过程的例子。我们将使用示例数据库中的film表进行演示:

img

1) 带有 INOUT 参数的基本 PostgreSQL 存储过程示例

首先,创建一个存储过程来计算film表中的行数:

create or replace procedure count_film(
    inout total_film int default 0
) 
as 
$$
begin
    select count(*) from film
    into total_film;
end;
$$
language plpgsql;

第二步,不提供total_film参数,调用存储过程:

call count_film();

输出:

 total_film
------------
       1000
(1 row)

第三步,在匿名块中调用存储过程count_film()

do
$$
declare
   total_film int = 0;
begin
   call count_film(total_film);
   raise notice 'Total film: %', total_film;
end;
$$;

输出:

NOTICE:  Total film: 1000

2) 创建带有多个 INOUT 参数的存储过程

首先,创建一个新的存储过程,来检索电影统计信息,包括电影数量、总时长和平均出租率:

create or replace procedure film_stat(
   inout total_film int default 0,
   inout total_length int default 0,
   inout avg_rental_rate numeric(4,2) default 0
)
as
$$
begin
  select count(*) into total_film
  from film;
  
  select sum(length) into total_length
  from film;
  
  select round(avg(rental_rate),2) into avg_rental_rate
  from film;  
end;
$$
language plpgsql;

然后,调用存储过程film_stat()

call film_stat();

由于film_stat()存储过程中的所有参数都是inout参数,因此不需要传递任何参数。

输出:

 total_film | total_length | avg_rental_rate
------------+--------------+-----------------
       1000 |       115272 |            2.98
(1 row)

总结

在 PostgreSQL 中,使用INOUT参数从存储过程返回值。

了解更多

PostgreSQL PL/pgSQL 教程