八月 18, 2023
摘要:在本教程中,您将了解函数的参数模式,包括:in
、out
、 和inout
。
目录
PL/pgSQL 参数模式简介
参数模式决定参数的行为。PL/pgSQL 支持三种参数模式:in
、out
、和inout
。如果您没有显式指定参数,则默认情况下参数会采用in
模式。
下表说明了三种参数模式:
IN | OUT | INOUT |
---|---|---|
默认 | 明确指定 | 明确指定 |
将值传递给函数 | 从函数返回一个值 | 将值传递给函数并返回更新后的值。 |
in 参数就像常量一样 |
out 参数的作用类似于未初始化的变量 |
inout 参数的作用类似于初始化变量 |
无法赋值 | 必须赋值 | 应该被赋值 |
IN 模式
以下函数通过 id 查找电影并返回电影的标题:
create or replace function find_film_by_id(p_film_id int)
returns varchar
language plpgsql
as $$
declare
film_title film.title%type;
begin
-- find film title by id
select title
into film_title
from film
where film_id = p_film_id;
if not found then
raise 'Film with id % not found', p_film_id;
end if;
return title;
end;$$
因为我们没有指定p_film_id
参数的模式,所以采用默认的in
模式。
OUT 模式
out
参数被定义为参数列表的一部分,并作为结果的一部分返回。
out
参数在需要返回多个值的函数中非常有用。
请注意,PostgreSQL 从 8.1 版本开始支持out
参数。
要定义out
参数,请在参数名称前显式添加out
关键字,如下所示:
out parameter_name type
以下示例定义了具有三个out
参数的get_film_stat
函数:
create or replace function get_film_stat(
out min_len int,
out max_len int,
out avg_len numeric)
language plpgsql
as $$
begin
select min(length),
max(length),
avg(length)::numeric(5,1)
into min_len, max_len, avg_len
from film;
end;$$
在get_film_stat
函数中,我们使用min
、max
和avg
聚合函数从film
表中查询电影长度的最小、最大和平均值,并将结果分配给相应的out
参数。
以下语句调用该get_film_stat
函数:
select get_film_stat();
该函数的输出是一条记录。要使输出分隔为列,请使用以下语句:
select * from get_film_stat();
INOUT 模式
inout
模式是in
模式和out
模式的组合。
这意味着调用者可以将参数传递给函数。该函数更改参数并返回更新后的值。
以下swap
函数接受两个整数类型参数及其值:
create or replace function swap(
inout x int,
inout y int
)
language plpgsql
as $$
begin
select x,y into y,x;
end; $$;
以下语句调用该swap()
函数:
select * from swap(10,20);
总结
- PL/pgSQL 支持三种参数模式:
in
、out
和intout
。默认情况下,参数采用in
模式。 - 如果要将值传递给函数,请使用
in
模式。 - 如果您想从函数返回值,请使用
out
模式。 - 当您想要传入初始值、更新函数中的值并返回更新后的值时,请使用
inout
模式。