五月 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
表进行演示:
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
参数从存储过程返回值。