如何封装PostgreSQL的record_out()函数创建IMMUTABLE包装函数
record_out的IMMUTABLE包装实现方案 你在lib/目录下找不到对应库导出是正常的:record_out不属于任何第三方扩展,是PostgreSQL核心内置的函数,符号直接编译在PostgreSQL主程序二进制中,不需要依赖lib/目录下的插件库,参照unaccent的封装逻辑按以下步骤实现即可:
- 第一步:声明绑定核心C函数的不可变版本
和unaccent示例中绑定C函数的逻辑一致,只是因为是核心内置函数,语言指定为internal,不需要写第三方库路径:
CREATE OR REPLACE FUNCTION public.immutable_record_out(record) RETURNS cstring LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'record_out';
- 第二步:封装为方便业务调用的SQL层函数
根据你的实际使用场景做类型转换即可,最常用的是将任意行类型记录转为文本输出:
CREATE OR REPLACE FUNCTION public.f_record_out(record) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS $func$ SELECT public.immutable_record_out($1)::text $func$;
注意:只有当函数输出完全由入参决定、不受任何会话配置、搜索路径、系统状态影响时,才可以标记为IMMUTABLE。
record_out的输出仅和输入的record内容相关,标记为IMMUTABLE是安全的,可以正常用于表达式索引、生成列等场景。
内容的提问来源于stack exchange,提问作者Gili
相关产品推荐
相关产品推荐

