📜  PostgreSQL-函数(1)

📅  最后修改于: 2023-12-03 15:33:45.820000             🧑  作者: Mango

PostgreSQL-函数

PostgreSQL 函数是在数据库中执行特定任务的可重用代码块。可以将部分重复的代码抽象到一个函数中,并将代码块的可读性增强。通过调用函数,可以减少代码中的重复内容,提高代码质量、性能和可维护性。

函数的定义与语法
定义

以下是创建 PostgreSQL 函数的通用语法:

CREATE FUNCTION function_name (argument_list) RETURNS return_value
AS $$
    function_body;
$$ LANGUAGE language_name;

其中,

  • function_name:要创建的函数名;
  • argument_list:要传递给函数的参数列表;
  • return_value:函数的返回值类型;
  • function_body:函数的主体代码,支持多行代码,需要使用 $$ 包裹;
  • language_name:编写函数的语言名称,常用的为 plpgsql。

例如,以下是创建一个简单函数 add 的示例:

CREATE FUNCTION add (a int, b int) RETURNS int
AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;
调用

调用 PostgreSQL 函数的语法如下:

SELECT function_name(arguments);

例如,对于上文提到的函数 add,可以这样调用它:

SELECT add(3, 5); -- 返回 8
函数的参数
传递参数

函数参数可以是特定类型的变量或常量。可以通过两种方式传递参数:位置参数或命名参数。

下面是调用函数时传递参数的通用语法:

SELECT function_name(param1, param2, ...);

其中,

  • param1, param2, ...:要传递给函数的参数列表,支持位置参数和命名参数。
位置参数

位置参数是指按顺序传递给函数的参数,例如:

CREATE FUNCTION foo(a int, b text, c numeric) RETURNS void
AS $$
BEGIN
    -- do something
END;
$$ LANGUAGE plpgsql;

SELECT foo(1, 'hello', 3.14);
命名参数

命名参数使我们能够通过名称而不是位置来传递函数参数:

SELECT foo(c := 3.14, b := 'hello', a := 1);
函数的返回值
返回单值

对于只有一个返回值的函数,可以使用以下格式定义返回类型:

CREATE FUNCTION some_function() RETURNS RETURNS return_type
AS $$
BEGIN
    RETURN some_value;
END;
$$ LANGUAGE plpgsql;

例如,以下函数返回一个整数:

CREATE FUNCTION return_int () RETURNS int
AS $$
BEGIN
    RETURN 42;
END;
$$ LANGUAGE plpgsql;
返回多个值

PostgreSQL 支持返回多个值。可以使用以下语法在函数中返回多个值:

CREATE FUNCTION some_function() RETURNS TABLE (column_name_1 column_type_1, column_name_2 column_type_2, ...)
AS $$
BEGIN
    RETURN QUERY SELECT some_value_1, some_value_2, ...;
END;
$$ LANGUAGE plpgsql;

其中,

  • column_name_1, column_name_2, ...:要返回的结果列的列名;
  • column_type_1, column_type_2, ...:要返回的结果列的数据类型;
  • some_value_1, some_value_2, ...:要返回的实际值。

以下是一个返回多个值的函数的示例:

CREATE FUNCTION return_multiple_values() RETURNS TABLE (id INTEGER, name TEXT, age INTEGER)
AS $$
BEGIN
    RETURN QUERY VALUES (1, 'Alice', 25), (2, 'Bob', 30);
END;
$$ LANGUAGE plpgsql;

SELECT * FROM return_multiple_values();
函数的类型

PostgreSQL 支持各种类型的函数,包括内置函数、用户定义函数和扩展函数。

内置函数

PostgreSQL 内置了大量的函数,可以执行常见的任务,如字符串操作、日期和时间操作、数学操作等等。可以查看 PostgreSQL 文档 中的函数章节来获取完整列表。

以下是几个常见的内置函数示例:

-- 字符串操作
SELECT CONCAT('hello', 'world'); -- 返回 'helloworld'

-- 日期和时间操作
SELECT NOW()::date; -- 返回当前日期
SELECT NOW()::time; -- 返回当前时间
SELECT NOW(); -- 返回当前日期时间

-- 数学操作
SELECT SQRT(2); -- 返回 1.41421356
SELECT PI(); -- 返回 3.14159265358979
用户定义函数

用户定义函数是自己编写的函数,在满足特定需求时非常有用。可以查看前面关于如何定义和调用用户定义函数的章节来获取更多信息。

以下是一个用户定义函数示例:

CREATE FUNCTION greet(name text) RETURNS text
AS $$
BEGIN
    RETURN CONCAT('Hello, ', name, '!');
END;
$$ LANGUAGE plpgsql;

SELECT greet('Alice'); -- 返回 'Hello, Alice!'
SELECT greet('Bob'); -- 返回 'Hello, Bob!'
扩展函数

扩展函数是安装当前 PostgreSQL 实例的扩展包提供的函数,可以扩展 PostgreSQL 的功能。例如,PostGIS 是一个用于支持地理空间数据的扩展。

可以使用以下语句查看已安装的扩展:

SELECT * FROM pg_available_extensions WHERE installed_version IS NOT NULL;

以下是一个使用 PostGIS 扩展的示例:

SELECT ST_DistanceSphere(
    ST_MakePoint(-97.73, 30.27), -- Austin
    ST_MakePoint(-73.98, 40.73) -- New York City
);
-- 返回 2302360.96529319,表示两个城市之间的距离(单位为米)
总结

PostgreSQL 函数是提高 PL/pgSQL 代码复用率、可读性和可维护性的重要方法。开发人员应该熟悉如何定义、调用和使用 PostgreSQL 函数。在合适的场景下,用户定义函数和扩展函数也可以作为增强 PostgreSQL 功能的重要工具。