📜  PostgreSQL –函数参数模式

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

PostgreSQL –函数参数模式

在使用过程和函数时,PostgreSQL 允许我们将数据从调用程序传递到过程或函数,并从过程或函数接收数据。此功能是使用参数实现的。

在函数定义中声明的参数称为形式参数。当调用过程或函数时,调用程序提供要在被调用程序处理中使用的数据以及从被调用程序接收处理结果的变量。当过程或函数被称为实际参数时,调用程序提供的数据和变量。

参数模式用于决定参数的行为。 PL/pgSQL 支持三种参数模式: in、outinout 。默认情况下,参数使用 IN 模式。

输入模式:

IN 模式用于将值传递给函数。 IN 参数就像常量一样简单。不能为 IN 参数分配任何值。 IN 模式是默认模式,如果未明确指定,则会分配该模式。

输出模式:

OUT 参数被声明为参数列表的一部分,并作为结果的一部分返回。 OUT 参数在需要返回多个值的函数中非常有用。它们就像未初始化的变量。
与 IN 参数不同,必须为 OUT 参数分配一个值。

输入模式:

INOUT 模式是 IN 和 OUT 模式的简单组合。在 INOUT 模式中,调用者将参数传递给过程或函数。在函数处理过程中,参数的值发生变化,函数返回相同的值。因此,INOUT 参数的作用类似于初始化变量,它们应该在函数处理期间被赋值。

下表说明了三参数模式:

INOUTINOUT
Taken by defaultNeed to be specified explicitlyNeed to be specified explicitly
Values are passed to a functionValue is returned by a functionA value is passed to the function which returns another updated value
Behaves like constantsBehaves like an uninitialized variableBehaves like an initialized variable
Values cannot be assignedMust assign a valueShould assign a value

为了进行测试,我们使用以下命令创建示例表来执行示例:

CREATE TABLE employees (

   employee_id serial PRIMARY KEY,

   full_name VARCHAR NOT NULL,

   manager_id INT

);

然后我们将数据插入到我们的员工表中,如下所示:

INSERT INTO employees (
   employee_id,
   full_name,
   manager_id
)
VALUES
   (1, 'M.S Dhoni', NULL),
   (2, 'Sachin Tendulkar', 1),
   (3, 'R. Sharma', 1),
   (4, 'S. Raina', 1),
   (5, 'B. Kumar', 1),
   (6, 'Y. Singh', 2),
   (7, 'Virender Sehwag ', 2),
   (8, 'Ajinkya Rahane', 2),
   (9, 'Shikhar Dhawan', 2),
   (10, 'Mohammed Shami', 3),
   (11, 'Shreyas Iyer', 3),
   (12, 'Mayank Agarwal', 3),
   (13, 'K. L. Rahul', 3),
   (14, 'Hardik Pandya', 4),
   (15, 'Dinesh Karthik', 4),
   (16, 'Jasprit Bumrah', 7),
   (17, 'Kuldeep Yadav', 7),
   (18, 'Yuzvendra Chahal', 8),
   (19, 'Rishabh Pant', 8),
   (20, 'Sanju Samson', 8);

表格是:

示例 1:

创建以下函数以在给定员工 ID 及其经理 ID 的情况下查找员工的姓名及其经理 ID。

create or replace function get_stats(
  in eid int,
  out name varchar,
  inout mid int)
language plpgsql
as $$
begin
  select full_name,manager_id
  into name,mid
  from employees
  where manager_id=mid
  and
  employee_id=eid;
end; $$;

要调用此函数,我们需要提供员工 ID,然后提供经理 ID。举个例子,

select * from get_stats(2,1);

输出:

在此示例中,我们将员工姓名作为 OUT,因为我们需要输出姓名,员工 ID 作为 IN,因为它只需要作为输入,经理 ID 作为 INOUT,因为它既需要作为输入也需要作为输出.

示例 2:

以下函数用于获取员工表中的员工数。

create or replace function empcount(
  out ecount int)
language plpgsql
as $$
begin
  select count(*)
  into ecount
  from employees;
end; $$;

要调用此函数:

select * from empcount();

输出:

示例 3:

以下函数用于交换 2 个变量的内容

create or replace function swapper(
  inout x int,
  inout y int)
language plpgsql
as $$
begin
  select x,y into y,x;
end; $$;

要调用此函数:

select * from swapper(198,457);

输出:

由于我们需要更改值然后显示更改后的值,因此我们使用 INOUT 模式。