1. 通用框架

CREATE [OR REPLACE] FUNCTION function_name(arg1 type1, ...)
  RETURNS return_type
  LANGUAGE {sql | plpgsql | …}
  [IMMUTABLE | STABLE | VOLATILE]
  [SECURITY DEFINER | SECURITY INVOKER]
AS $$
  -- SQL 语句或 PL/pgSQL 块
$$;

2. Helper SQL 函数(LANGUAGE sql)

适合“一步到位”的纯 SQL 操作,无须过程控制。

示例:

CREATE OR REPLACE FUNCTION jwt_claim_uuid()
  RETURNS uuid
  LANGUAGE sql
  STABLE
AS $$
  SELECT current_setting('request.jwt.claims.uuid', true)::uuid;
$$;

3. 复杂逻辑函数(LANGUAGE plpgsql)

当需要条件判断、变量、异常处理或触发器时使用。

3.1 普通 PL/pgSQL 函数

CREATE OR REPLACE FUNCTION fn_name(params...) RETURNS return_type
  LANGUAGE plpgsql
  VOLATILE
AS $$
DECLARE
  var1 type;
BEGIN
  -- 过程化逻辑:IF/LOOP/FOR
  IF params... THEN
    var1 := ...;
  END IF;

  RETURN var1;
END;
$$;

3.2 触发器函数

专门用于响应表的 INSERT/UPDATE/DELETE 事件。