跳到主要内容

PostgreSQL Functions

  • 定义 FUNCTION
    • VOLATILE - 默认
    • IMMUTABLE - 不修改 DB,不查询 DB,参数相同总是返回一样的值
    • STABLE - 不修改 DB,根据环境不同可能返回值变化
      • current_timestamp 是 STABLE
    • PARALLEL { UNSAFE | RESTRICTED | SAFE }
      • RESTRICTED - 默认
    • LEAKPROOF - 函数无 副作用
      • 安全相关
      • 只有 superuser 可以设置
  • 控制流
    • NULLIF(value,match)
    • COALESCE(values...) - 返回第一个非 NULL
      • 不会都求值
  • 参考
-- 常用方式
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

-- 更 SQL 的方式
CREATE FUNCTION add(a integer, b integer) RETURNS integer
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT
RETURN a + b;

-- PL/pgSQ
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer
AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;

默认 PUBLIC 可执行 函数

-- 不允许 PUBLIC 执行
ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

PROCEDURE vs FUNCTION vs ROUTINE

  • PROCEDURE - SQL 标准
    • 不返回值
    • 可以使用 OUT 参数
    • 使用 CALL 调用
    • 可以 嵌套事务
  • FUNCTION
    • 可以 RETURN 可以 OUT 参数
    • 使用 SELECT 调用
    • 不可以嵌套事务
    • 支持多种语言: SQL, PL/pgSQL, C, 扩展语言
    • 语法更丰富
      • VARIADIC
      • DEFAULT
      • 多态
      • 重载
      • 返回表
  • ROUTINE=PROCEDURE+FUNCTION
    • ALTER ROUTINE, DROP ROUTINE 可用于操作 FUNCTION 或 PROCEDURE
    • 没有 CREATE ROUTINE