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 块
$$;
sql
:适合简单的单条 SELECT/INSERT/UPDATE/DELETE。plpgsql
:用于复杂逻辑、分支、循环、异常处理。IMMUTABLE
:对相同输入始终相同输出,可用于索引表达式。STABLE
:同一次查询中对相同输入保持一致(如当前时区函数)。VOLATILE
:每次调用都可能不同(默认)。适合“一步到位”的纯 SQL 操作,无须过程控制。
示例:
CREATE OR REPLACE FUNCTION jwt_claim_uuid()
RETURNS uuid
LANGUAGE sql
STABLE
AS $$
SELECT current_setting('request.jwt.claims.uuid', true)::uuid;
$$;
STABLE
或 IMMUTABLE
。当需要条件判断、变量、异常处理或触发器时使用。
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;
$$;
DECLARE:定义局部变量。
BEGIN…END:包裹逻辑块,可多条语句。
异常处理(可选):
BEGIN
-- 可能抛错的操作
EXCEPTION WHEN unique_violation THEN
-- 处理冲突
END;
专门用于响应表的 INSERT/UPDATE/DELETE 事件。