📅  最后修改于: 2020-12-01 00:52:24             🧑  作者: Mango
在本节中,我们将了解PostgreSQL函数的工作原理,创建函数命令,并使用PostgreSQL的不同工具(例如pgadmin4和SQL Shell(PSQL))查看PostgreSQL CREATE FUNCTION命令的实时示例。
并参见调用用户定义函数的示例,例如称为记法的位置记法,即混合记法。
PostgreSQL函数或存储过程是存储在数据库服务器上的一组SQL和过程命令,例如声明,赋值,循环,控制流等,并且可以使用SQL接口来涉及。它也被称为PostgreSQL存储过程。
我们可以使用服务语言创建PostgreSQL函数,例如SQL , PL / pgSQL , C , Python等。
它使我们能够执行操作,这些操作通常会在数据库中的函数执行各种命令和往返行程。
在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 |
|
[OR REPLACE] |
|
Function |
|
RETURN |
|
Language plpgsql |
|
Function_body |
|
让我们看一个不同的例子来理解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 。
我们在标题部分使用了以下参数:
我们在“功能主体”部分中使用了以下参数:
在PostgreSQL中,我们可以通过两种方式创建函数:
我们将按照以下过程在pgAdmin中创建一个函数:
步骤1
首先,我们将在本地系统中打开最新版本的pgAdmin ,然后转到对象树并连接到要在其中创建函数的Javatpoint示例数据库。
第2步
之后,我们将通过单击查询工具,然后单击工具部分来打开查询工具,如下面的屏幕截图所示:
第三步
要创建get_car_Price1()函数,我们将在查询工具中使用以上代码,然后单击Execute按钮。
执行完上述命令后,我们将获得以下消息窗口,显示函数get_car_Price1()已成功创建到类似的数据库中。
并且,我们可以在“函数”列表中标识函数get_car_Price() ,如下面的屏幕快照所示:
注意:如果我们无法识别函数名称,则可以右键单击“函数”节点,然后选择“刷新…”菜单项以恢复函数列表:
我们将按照以下过程在psql中创建表:
步骤1
第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()参数是26000和70000 ,这等效于Price_from和Price_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函数部分,我们学习了以下主题: