更新时间:2024-10-10 GMT+08:00

PG_PROC

PG_PROC系统表存储函数或过程的信息。

表1 PG_PROC字段

名称

类型

描述

proname

name

函数名。

pronamespace

oid

此函数所在命名空间的OID。

proowner

oid

函数的所有者。

prolang

oid

实现语言或函数的调用接口。

procost

real

估计执行成本。

prorows

real

结果行估计数。

provariadic

oid

参数元素的数据类型。

protransform

regproc

此函数的简化调用方式。

proisagg

boolean

函数是否为聚集函数。

proiswindow

boolean

函数是否为窗口函数。

prosecdef

boolean

函数是否为一个安全定义器(例如,一个“setuid”函数)。

proleakproof

boolean

函数有无其他影响。如果函数没有对参数进行防泄露处理,则会抛出错误。

proisstrict

boolean

如果任意调用参数为空,函数是否返回空值。这种情况下函数实际上根本不会被调用。非“strict”的函数必须准备处理空值输入。

proretset

boolean

函数是否返回一个集合(即,指定数据类型的多个数值)。

provolatile

"char"

说明该函数的结果是只倚赖于它的输入参数,或者还会被外接因素影响。

  • i表示“不可变的”(immutable)函数,对于相同的输入总是输出相同的结果。
  • s表示“稳定的”(stable)函数,对于固定输入其结果在一次扫描里不变。
  • v表示“易变”(volatile)函数,其结果可能在任何时候都变化。

pronargs

smallint

参数个数。

pronargdefaults

smallint

有默认值的参数个数。

prorettype

oid

返回参数类型的OID。

proargtypes

oidvector

函数参数数据类型的数组。数组里只包括输入参数(包括INOUT参数),因此也表现了函数的调用特征。

proallargtypes

oid[]

函数参数数据类型的数组。数组里包括所有参数的类型(包括OUT和INOUT参数),如果所有参数都是IN参数,则这个字段就会为空。注意数组下标是以1为起点的,而因为历史原因,proargtypes的下标起点为0。

proargmodes

"char"[]

函数参数模式的数组。

  • i表示IN参数
  • o表示OUT参数
  • b表示INOUT参数

如果所有参数都是IN参数,则这个字段为空。注意此数组下标对应的是proallargtypes的位置,而不是proargtypes。

proargnames

text[]

函数参数名的数组。没有名字的参数在数组里设置为空字符串。如果没有一个参数有名字,这个字段为空。注意此数组的下标对应proallargtypes而不是proargtypes。

proargdefaults

pg_node_tree

默认值的表达式树。是PRONARGDEFAULTS元素的列表。

prosrc

text

描述函数或存储过程的定义。例如,对于解释型语言来说就是函数的源程序,或者一个链接符号,一个文件名,或者函数和存储过程创建时指定的其他任何函数体内容,具体取决于语言/调用习惯的实现。

probin

text

关于如何调用该函数的附加信息。同样,其含义也是和语言相关的。

proconfig

text[]

函数针对运行时配置变量的本地设置。

proacl

aclitem[]

访问权限。具体请参见GRANT和REVOKE。

prodefaultargpos

int2vector

函数默认值的位置,不局限于能最后几个参数才可有默认值。

fencedmode

boolean

函数的执行模式,表示函数是在fence还是not fence模式下执行。如果是fence执行模式,函数的执行会在重新fork的进程中执行。默认值是fence。

proshippable

boolean

函数是否可以下推到DN上执行,默认值是false。

  • 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。
  • 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。

propackage

boolean

该函数是否支持重载,主要针对Oracle风格的函数,默认值是false。

应用示例

查询指定函数的OID。例如,获取函数justify_days的OID为1295。

1
2
3
4
5
SELECT oid FROM pg_proc WHERE proname ='justify_days';
 oid
------
 1295
(1 row)

查询指定函数是否为聚集函数。例如,查询justify_days函数为非聚集函数。

1
2
3
4
5
SELECT proisagg FROM pg_proc WHERE proname ='justify_days';
 proisagg
----------
 f
(1 row)

查询指定函数的所有者。例如,查询获取func_add_sql函数的owner为用户u1。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT proowner FROM pg_proc WHERE proname='func_add_sql';
 proowner
----------
   542778
(1 row)

SELECT usename FROM pg_user WHERE usesysid = '542778';
 usename
---------
 u1
(1 row)