作者:文一,应急管理大学在读本科生,中国 PostgreSQL 分会实训基地秘书长,《数据库红皮书》(线上读物)译者,曾经在中国科学院,北京航空航天大学等分享过 PostgreSQL 内核学习有关的经验与材料。MOP 社区会员,IvorySQL 社区成员。
在 PostgreSQL 中,pg_get_functiondef 函数可以帮助我们构造用户自定义函数(User-Defined Function)创建时的语句,其实现原理流程如下:
接收用户指定的 OID
根据 OID,在系统表 pg_proc 中搜寻对应函数记录
根据函数记录对应的各部分信息,重新组装 CREATE FUNCTION 查询语句
反馈给用户对应的结果
对应代码参考如下:
/*
代码经过精简,提取自 src/backend/utils/adt/ruleutils.c
*/
Datum
pg_get_functiondef_internal(PG_FUNCTION_ARGS)
{
/* 提取记录于系统缓存中的函数描述记录,根据 OID 获取指定的条目 */
proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
proc = (Form_pg_proc) GETSTRUCT(proctup);
/* 根据系统数据表 pg_proc 中的各个属性的记录,重新组装 CREATE FUNCTION 语句 */
/* 如:此处自记录中获取函数的名称 */
name = NameStr(proc->proname);
/* 随后,它就成为了最后导出的 SQL 语句中的一部分 */
appendStringInfo(&buf, "CREATE OR REPLACE %s %s(",
isfunction ? "FUNCTION" : "PROCEDURE",
quote_qualified_identifier(nsp, name));
/*
其它部分的逻辑与之相通,区别在于对应 CREATE FUNCTION 语句的部分不一样
关于 pg_proc 各个条目的具体内涵,参考:
https://www.postgresql.org/docs/devel/catalog-pg-proc.html
*/
// ...
/* 最终,返回构造完成的 SQL 语句 */
PG_RETURN_TEXT_P(string_to_text(buf.data));
}
文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




