PostgreSQL 教程: PL/pgSQL 函数参数模式: IN、OUT、INOUT

八月 18, 2023

摘要:在本教程中,您将了解函数的参数模式,包括:inout、 和inout

PL/pgSQL 参数模式简介

参数模式决定参数的行为。PL/pgSQL 支持三种参数模式:inout、和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函数中,我们使用minmaxavg聚合函数从film表中查询电影长度的最小、最大和平均值,并将结果分配给相应的out参数。

以下语句调用该get_film_stat函数:

select get_film_stat();

img

该函数的输出是一条记录。要使输出分隔为列,请使用以下语句:

select * from get_film_stat();

img

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

img

概括

  • PL/pgSQL 支持三种参数模式:inoutintout。默认情况下,参数采用in模式。

  • 如果要将值传递给函数,请使用in模式。

  • 如果您想从函数返回值,请使用out模式。

  • 当您想要传入初始值、更新函数中的值并返回更新后的值时,请使用inout模式。