Skip to content

自定义函数 ​

PostgreSQL 允许用户通过创建自定义函数来扩展数据库的功能。自定义函数可以是用 SQL、PL/pgSQL 或其他编程语言编写的。

创建简单的 SQL 函数 ​

SQL 函数通过 CREATE FUNCTION 语句创建,支持 SQL 语句的封装和重复使用。

基本语法 ​

sql
CREATE FUNCTION function_name(parameters)
RETURNS return_type AS
$$
  function_body
$$
LANGUAGE sql;

示例:计算员工工资总和 ​

sql
CREATE FUNCTION total_salary()
RETURNS numeric AS
$$
  SELECT SUM(salary) FROM employees;
$$
LANGUAGE sql;

调用 SQL 函数 ​

sql
SELECT total_salary();

PL/pgSQL 自定义函数 ​

PL/pgSQL 是 PostgreSQL 的过程化编程语言,支持更复杂的逻辑和控制结构。

基本语法 ​

sql
CREATE FUNCTION function_name(parameters)
RETURNS return_type AS
$$
  DECLARE
    -- 变量声明
  BEGIN
    -- 函数体
  END;
$$
LANGUAGE plpgsql;

示例:计算员工平均工资 ​

sql
CREATE FUNCTION avg_salary(department_id INT)
RETURNS numeric AS
$$
DECLARE
  avg_salary numeric;
BEGIN
  SELECT AVG(salary) INTO avg_salary
  FROM employees
  WHERE department_id = department_id;
  
  RETURN avg_salary;
END;
$$
LANGUAGE plpgsql;

调用 PL/pgSQL 函数 ​

sql
SELECT avg_salary(1);

函数的参数 ​

PostgreSQL 支持输入参数、返回值和可选的默认值。函数参数可以是标量类型、复合类型或数组。

示例:使用默认参数 ​

sql
CREATE FUNCTION greet(name TEXT DEFAULT 'Guest')
RETURNS TEXT AS
$$
BEGIN
  RETURN 'Hello, ' || name || '!';
END;
$$
LANGUAGE plpgsql;

调用该函数时,未提供参数则使用默认值:

sql
SELECT greet(); -- 输出 'Hello, Guest!'
SELECT greet('Alice'); -- 输出 'Hello, Alice!'

返回多个值 ​

函数可以返回多个值,这可以通过使用 SETOF 或复合类型来实现。

示例:返回一个记录集 ​

sql
CREATE FUNCTION get_employees(department_id INT)
RETURNS SETOF employees AS
$$
BEGIN
  RETURN QUERY
  SELECT * FROM employees WHERE department_id = department_id;
END;
$$
LANGUAGE plpgsql;

调用返回多个值的函数 ​

sql
SELECT * FROM get_employees(1);

函数的调试与日志记录 ​

可以使用 RAISE NOTICE 语句在 PL/pgSQL 函数中输出调试信息。

示例:调试信息输出 ​

sql
CREATE FUNCTION debug_example(value INT)
RETURNS VOID AS
$$
BEGIN
  RAISE NOTICE 'Input value: %', value;
END;
$$
LANGUAGE plpgsql;

调用函数时,会输出调试信息:

sql
SELECT debug_example(100);

函数的权限管理 ​

默认情况下,只有创建者或超级用户可以执行函数。可以通过 GRANT 语句授予其他用户执行权限。

示例:授予权限 ​

sql
GRANT EXECUTE ON FUNCTION total_salary() TO user_name;

小结 ​

自定义函数在 PostgreSQL 中提供了强大的扩展能力,能够帮助开发者在数据库内部执行复杂的逻辑和计算。通过 SQL 和 PL/pgSQL 编写函数,可以简化查询、提高效率,并且通过灵活的参数和返回值机制,能够满足多样化的需求。

自定义函数 ​

PostgreSQL 允许用户通过创建自定义函数来扩展数据库的功能。自定义函数可以是用 SQL、PL/pgSQL 或其他编程语言编写的。

创建简单的 SQL 函数 ​

SQL 函数通过 CREATE FUNCTION 语句创建,支持 SQL 语句的封装和重复使用。

基本语法 ​

sql
CREATE FUNCTION function_name(parameters)
RETURNS return_type AS
$$
  function_body
$$
LANGUAGE sql;

示例:计算员工工资总和 ​

sql
CREATE FUNCTION total_salary()
RETURNS numeric AS
$$
  SELECT SUM(salary) FROM employees;
$$
LANGUAGE sql;

调用 SQL 函数 ​

sql
SELECT total_salary();

PL/pgSQL 自定义函数 ​

PL/pgSQL 是 PostgreSQL 的过程化编程语言,支持更复杂的逻辑和控制结构。

基本语法 ​

sql
CREATE FUNCTION function_name(parameters)
RETURNS return_type AS
$$
  DECLARE
    -- 变量声明
  BEGIN
    -- 函数体
  END;
$$
LANGUAGE plpgsql;

示例:计算员工平均工资 ​

sql
CREATE FUNCTION avg_salary(department_id INT)
RETURNS numeric AS
$$
DECLARE
  avg_salary numeric;
BEGIN
  SELECT AVG(salary) INTO avg_salary
  FROM employees
  WHERE department_id = department_id;
  
  RETURN avg_salary;
END;
$$
LANGUAGE plpgsql;

调用 PL/pgSQL 函数 ​

sql
SELECT avg_salary(1);

函数的参数 ​

PostgreSQL 支持输入参数、返回值和可选的默认值。函数参数可以是标量类型、复合类型或数组。

示例:使用默认参数 ​

sql
CREATE FUNCTION greet(name TEXT DEFAULT 'Guest')
RETURNS TEXT AS
$$
BEGIN
  RETURN 'Hello, ' || name || '!';
END;
$$
LANGUAGE plpgsql;

调用该函数时,未提供参数则使用默认值:

sql
SELECT greet(); -- 输出 'Hello, Guest!'
SELECT greet('Alice'); -- 输出 'Hello, Alice!'

返回多个值 ​

函数可以返回多个值,这可以通过使用 SETOF 或复合类型来实现。

示例:返回一个记录集 ​

sql
CREATE FUNCTION get_employees(department_id INT)
RETURNS SETOF employees AS
$$
BEGIN
  RETURN QUERY
  SELECT * FROM employees WHERE department_id = department_id;
END;
$$
LANGUAGE plpgsql;

调用返回多个值的函数 ​

sql
SELECT * FROM get_employees(1);

函数的调试与日志记录 ​

可以使用 RAISE NOTICE 语句在 PL/pgSQL 函数中输出调试信息。

示例:调试信息输出 ​

sql
CREATE FUNCTION debug_example(value INT)
RETURNS VOID AS
$$
BEGIN
  RAISE NOTICE 'Input value: %', value;
END;
$$
LANGUAGE plpgsql;

调用函数时,会输出调试信息:

sql
SELECT debug_example(100);

函数的权限管理 ​

默认情况下,只有创建者或超级用户可以执行函数。可以通过 GRANT 语句授予其他用户执行权限。

示例:授予权限 ​

sql
GRANT EXECUTE ON FUNCTION total_salary() TO user_name;

小结 ​

自定义函数在 PostgreSQL 中提供了强大的扩展能力,能够帮助开发者在数据库内部执行复杂的逻辑和计算。通过 SQL 和 PL/pgSQL 编写函数,可以简化查询、提高效率,并且通过灵活的参数和返回值机制,能够满足多样化的需求。

Released under the MIT License.