PostgreSQL:如何获取刚创建的函数/存储过程的名称或OID?
在PostgreSQL中获取刚创建的函数/存储过程的OID或名称
方法一:使用CREATE ... RETURNING子句(PostgreSQL 11及以上版本)
PostgreSQL 11开始支持在CREATE FUNCTION和CREATE PROCEDURE语句后添加RETURNING子句,直接返回刚创建对象的OID或名称,这是最简便的方式。
示例:
- 创建函数并返回OID和名称:
CREATE FUNCTION test_func(a int) RETURNS int AS $$ BEGIN RETURN a + 1; END; $$ LANGUAGE plpgsql RETURNING oid, proname;
执行后会直接返回一行结果,包含该函数的OID和名称test_func。
- 创建存储过程的写法同理:
CREATE PROCEDURE test_proc(a int) AS $$ BEGIN RAISE NOTICE 'Input: %', a; END; $$ LANGUAGE plpgsql RETURNING oid, proname;
方法二:查询系统表(适用于所有版本)
如果使用PostgreSQL 10及更早版本,无法用RETURNING子句,可以查询系统表筛选最新创建的对象,注意单用户操作场景下更可靠,并发场景可能存在冲突。
示例:
通过统计信息表的创建时间筛选当前schema下最新的函数/存储过程:
SELECT p.oid, p.proname FROM pg_proc p JOIN pg_stat_user_functions s ON p.oid = s.funcid WHERE p.pronamespace = current_schema()::regnamespace ORDER BY s.creation_time DESC LIMIT 1;
也可以直接通过定义文本匹配(需保证文本格式完全一致):
SELECT oid, proname FROM pg_proc WHERE prosrc = 'BEGIN RETURN a + 1; END;' AND pronamespace = current_schema()::regnamespace;
注意事项
- 优先使用
CREATE ... RETURNING子句,避免并发场景下的匹配错误。 - 查询系统表时,建议加上当前schema(
pronamespace)的过滤条件,缩小匹配范围。
内容的提问来源于stack exchange,提问作者seth
相关产品推荐
相关产品推荐

