📜  PostgreSQL函数

📅  最后修改于: 2020-12-01 00:52:24             🧑  作者: Mango

PostgreSQL函数

在本节中,我们将了解PostgreSQL函数的工作原理,创建函数命令,并使用PostgreSQL的不同工具(例如pgadmin4SQL Shell(PSQL))查看PostgreSQL CREATE FUNCTION命令的实时示例

并参见调用用户定义函数的示例,例如称为记法的位置记法,即混合记法。

PostgreSQL函数是什么?

PostgreSQL函数或存储过程是存储在数据库服务器上的一组SQL和过程命令,例如声明,赋值,循环,控制流等,并且可以使用SQL接口来涉及。它也被称为PostgreSQL存储过程

我们可以使用服务语言创建PostgreSQL函数,例如SQLPL / pgSQLCPython等。

它使我们能够执行操作,这些操作通常会在数据库中的函数执行各种命令和往返行程。

PostgreSQL CREATE Function命令是什么?

在PostgreSQL中,如果要指定一个新的用户定义函数,可以使用CREATE FUNCTION命令。

PostgreSQL CREATE Function命令的语法

PostgreSQL CREATE Function的语法如下:

CREATE [OR REPLACE] FUNCTION function_name (arguments)   
RETURNS return_datatype 
LANGUAGE plpgsql
AS $variable_name$  
DECLARE  
declaration;  
[...] -- variable declaration 
 BEGIN  
< function_body >  
[...]  -- logic
RETURN { variable_name | value }  
END; 
$$

在上面的语法中,我们使用了以下参数,如下表所示:

Parameters Description
function_name
  • The function name parameter is used to define the function name.
  • The function name is written after the CREATE FUNCTION keyword.
[OR REPLACE]
  • We can use the OR REPLACE keyword if we want to change the current function.
  • And it is an optional parameter.
Function
  • After using the OR REPLACE keyword, we can define the function parameter list that are covered in the parentheses after the Function Name.
  • And a function can contain zero or several parameters.
RETURN
  • We can define the data type after the RETURN keyword, which we are going to return from the function.
  • It can be a base, composite, or domain type or reference of the type of a table column.
Language plpgsql
  • It is used to define the name of the Procedural language in which the function is executed.
  • And not just plpgsql, the PostgreSQL supports various procedural languages.
Function_body
  • The function_body contains the executable parts of the logics.

PostgreSQL创建函数命令示例

让我们看一个不同的例子来理解PostgreSQL CREATE Function命令的工作。

我们从PostgreSQL教程中创建的Javatpoint数据库中获取Car表。

创建一个新函数

在下面的命令,我们正在创造一个新的函数,计数Price_from和Price_to参数之间,其Car_Price汽车

Create function get_car_Price(Price_from int, Price_to int)
returns int
language plpgsql
as
$$
Declare
 Car_count integer;
Begin
   select count(*) 
   into Car_count
   from Car
   where Car_price between Price_from and Price_to;
   return Car_count;
End;
$$;

get_car_Price函数分为两个主要部分,即Header和Function Body

我们在标题部分使用了以下参数:

  • 首先,我们将函数名称指定为get_car_Price(),该名称写在create函数
  • 之后, get_car_Price()函数包含两个参数Price_fromPrice_to,它们的数据类型为整数。
  • 然后, get_car_Price()函数检索由return int条件定义的整数。
  • 最后,我们将函数语言用作plpgsql

我们在“功能主体”部分中使用了以下参数:

  • 我们已经用美元报价字符串常量说明在函数部分,它与$$和结束与$$开始。
  • $$符号之间,我们可以放置一个块,其中覆盖了函数的声明逻辑
  • 在声明块中,我们声明了一个名为Car_count的变量该变量存储从Car中选择的汽车
  • 在块部分的主体中,我们使用SELECT INTO命令选择值在Price_from和Price_to之间的汽车价格,并将输出提供给Car_count
  • 在该块的末尾,我们使用了RETURN命令来获取

在PostgreSQL中创建函数

在PostgreSQL中,我们可以通过两种方式创建函数:

  • PostgreSQL使用pgAdmin创建函数
  • PostgreSQL使用SQL Shell创建函数

PostgreSQL使用pgAdmin创建函数

我们将按照以下过程在pgAdmin中创建一个函数

步骤1

首先,我们将在本地系统中打开最新版本的pgAdmin ,然后转到对象树并连接到要在其中创建函数的Javatpoint示例数据库。

第2步

之后,我们将通过单击查询工具,然后单击工具部分来打开查询工具,如下面的屏幕截图所示:

第三步

要创建get_car_Price1()函数,我们将在查询工具中使用以上代码,然后单击Execute按钮。

执行完上述命令后,我们将获得以下消息窗口,显示函数get_car_Price1()已成功创建到类似的数据库中。

并且,我们可以在“函数”列表中标识函数get_car_Price() ,如下面的屏幕快照所示:


注意:如果我们无法识别函数名称,则可以右键单击“函数”节点,然后选择“刷新…”菜单项以恢复函数列表:

使用SQL Shell创建函数(psql)

我们将按照以下过程在psql中创建表:

步骤1

  • 首先,我们将在本地系统中打开psql ,然后连接到要创建函数的数据库。
  • 我们将在我们先前在PostgreSQL教程中创建的javatpoint数据库中创建一个表。

第2步

  • 为了连接数据库,我们将输入以下命令:
\c javatpoint

输出量

执行上述命令后,我们将获得以下输出:


注意:如果我们在psql中输入与上述类似的命令来创建一个函数,它将发出以下错误,即:函数get_car_price已存在且具有相同的参数类型。

因此,为解决此错误,我们在下一步中创建一个新函数get_car_Price1 ()。

第三步

我们将进入下面的命令来创建的javatpoint数据库<函数>get_car_Price1()。

javatpoint=# Create function get_car_Price1(Price_from int, Price_to int)
javatpoint-# returns int
javatpoint-# language plpgsql
javatpoint-# as
javatpoint-# $$
javatpoint$# Declare
javatpoint$#  Car_count integer;
javatpoint$# Begin
javatpoint$#    select count(*)
javatpoint$#    into Car_count
javatpoint$#    from Car
javatpoint$#    where car_price between Price_from and Price_to;
javatpoint$#    return Price_count;
javatpoint$# End;
javatpoint$# $$;

输出量

实现上述命令后,我们将获得以下输出,该命令显示get_car_Price_count1()函数已成功创建。

第四步

我们可以使用以下命令列出现有数据库中所有用户定义的函数。

javatpoint=# \df

输出量

执行完以上命令后,我们将得到以下输出:

如何调用用户定义的函数

在PostgreSQL中,我们可以通过三种方式调用用户定义的函数,如下所示:

  • 位置符号
  • 命名符号
  • 混合符号

使用位置表示法调用函数

如果要以与参数相似的顺序描述参数,则可以在位置表示法的帮助下调用函数。

让我们看一个示例示例,以了解位置表示法在调用特定函数。

在下面的示例中, get_car_price()参数是2600070000 ,这等效于Price_fromPrice_to参数。

Select get_car_Price(26000,70000);

输出量

实现上述命令后,我们将获得以下输出,该命令检索car_price在26000至70000之间的那四行。

当函数几乎没有任何参数时,我们可以借助位置符号来调用函数。

如果函数包含多个参数,则可以使用命名符号来调用特定的函数,因为使用命名符号将使函数调用更易于理解。

使用命名符号调用函数

在下面的示例中,我们显示了使用命名符号调用get_car_Price()函数的工作:

select get_car_Price(
 Price_from => 26000, 
    Price_to => 70000
);

输出量

执行上述命令后,我们将获得以下输出,该命令根据上述car_price范围显示四行。

在前面提到的符号中,我们使用了=>来区分参数的名称和值

PostgreSQL允许在:=上创建较旧的语法以实现向后兼容性,如下面的命令所示:

select get_car_Price(
 Price_from := 26000, 
     Price_to := 70000
);

输出量

执行上述命令后,与使用“ =>”而不是“:=”的上述命令结果相比,我们将获得类似的输出。

使用混合符号调用函数

它是位置和命名符号的分组。

让我们看一个示例示例,以了解使用混合表示法调用函数的工作方式。

混合表示法中,我们不能在位置参数之前使用命名参数。

例如:

在以下命令中,我们将Price_from参数的命名概念用作Price_from => 26000,而对于Price_to参数,我们将位置概念用作70000 ,如下面的命令所示:

select get_car_Price(Price_from=>26000,70000);

输出量

执行上述命令后,PostgreSQL引发错误,表明位置参数不能跟随命名参数

为了解决上述错误,我们在get_car_price()函数中使用了位置和命名符号,其中26000用于表示位置符号;另一方面, Price_to => 70000用于表示命名符号

select get_car_Price(26000,Price_to=>70000);

输出量

执行完上述命令后,我们将获得以下输出,该输出返回car_price在26000至70000之间的汽车。

总览

PostgreSQL函数部分,我们学习了以下主题:

  • 我们已使用CREATE Function命令为特定表创建用户定义的函数。
  • 我们已经了解了借助不同的表示法(例如位置,命名和混合)调用用户定义函数的过程