获取所有程序性的,用户定义的函数

时间:2013-05-19 06:43:47

标签: postgresql postgresql-9.2

如何通过SQL查询获取所有用户定义函数的列表?


我找到了这段代码here

SELECT p.proname, p.pronargs, t.typname
 FROM pg_proc p, pg_language l, pg_type t
 WHERE p.prolang = l.oid
 and p.prorettype = t.oid
 and l.lanname = 'c'
ORDER BY proname;

但这会得到C函数

如何获取用户定义的过程语言函数,例如用plpgsql语言编写?

1 个答案:

答案 0 :(得分:23)

考虑:

select 
    pp.proname,
    pl.lanname,
    pn.nspname,
    pg_get_functiondef(pp.oid)
from pg_proc pp
inner join pg_namespace pn on (pp.pronamespace = pn.oid)
inner join pg_language pl on (pp.prolang = pl.oid)
where pl.lanname NOT IN ('c','internal') 
  and pn.nspname NOT LIKE 'pg_%'
  and pn.nspname <> 'information_schema';

另请参阅:What is the command to find script of a existing function in postgresql?

直接使用pg_get_functiondefprosrc中的pg_proc列。关键的想法是加入pg_namespace并过滤掉PostgreSQL目录函数,这些函数可能适用于大多数目的:

FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'

获取用户定义的函数的源代码的麻烦在于决定 user 的含义。可以创建许多类型的函数:

  • 使用CREATE EXTENSION
  • 的功能
  • PostgreSQL创建的函数。
  • 管理员编译和安装的功能。

具有足够资助的超级用户可以在pg_proc中定义函数,但通常不会。

由于只有超级用户才能创建C语言函数,因此请将其排除。这些功能可以由管理员在特定数据库上自定义安装,但不能由普通用户自定义。