ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 47.36\. `pg_proc` `pg_proc`表存储关于函数(或过程)的信息。参阅[CREATE FUNCTION](#calibre_link-4) 和[Section 35.3](#calibre_link-737)获取更多信息。 该表包含聚集函数和普通函数的数据。如果`proisagg`为真, 那么在`pg_aggregate`里应该有一个匹配行。 **Table 47-36\. `pg_proc` 字段** | 名字 | 类型 | 引用 | 描述 | | --- | --- | --- | --- | | `oid` | `oid` | 行标识符(隐藏属性;必须明确选择) | | `proname` | `name` | 函数名字 | | `pronamespace` | `oid` | `pg_namespace`.oid | 包含该函数名字空间的 OID | | `proowner` | `oid` | `pg_authid`.oid | 函数的所有者 | | `prolang` | `oid` | `pg_language`.oid | 这个函数的实现语言或调用接口 | | `procost` | `float4` | 估计执行成本(以[cpu_operator_cost](#calibre_link-735)为单位);如果`proretset`, 这是每一行返回的成本 | | `prorows` | `float4` | 估计的结果行数(如果非`proretset`则为零) | | `provariadic` | `oid` | `pg_type`.oid | 可变数组参数的元素的数据类型,如果函数没有可变参数则为零 | | `protransform` | `regproc` | `pg_proc`.oid | 调用这个函数可以简化其他函数(参阅[Section 35.9.11](#calibre_link-746)) | | `proisagg` | `bool` | 函数是聚集函数 | | `proiswindow` | `bool` | 函数是窗口函数 | | `prosecdef` | `bool` | 函数是一个安全定义器(也就是一个"setuid"函数) | | `proleakproof` | `bool` | 该函数没有副作用。没有关于该参数的信息传递,除非通过返回值。 任何函数都有可能抛出一个错误,取决于它的参数值是不加密的。 | | `proisstrict` | `bool` | 如果任何调用参数是空,那么函数返回空。这时函数实际上连调用都不调用。 不是"strict"的函数必须准备处理空输入。 | | `proretset` | `bool` | 函数返回一个集合(也就是说,指定数据类型的多个数值) | | `provolatile` | `char` | 告诉该函数的结果是否只依赖于它的输入参数,或者还会被外接因素影响。 对于"不可变的"(immutable)函数它是 `i`, 这样的函数对于相同的输入总是产生相同的结果。对于"稳定的"(stable) 函数它是`s`,(对于固定输入)其结果在一次扫描里不变。 对于"易变"(volatile)函数它是`v`,其结果可能在任何时候变化。 `v`也用于那些有副作用的函数,因此调用它们无法得到优化。 | | `pronargs` | `int2` | 参数数目 | | `pronargdefaults` | `int2` | 有缺省值的参数的数量 | | `prorettype` | `oid` | `pg_type`.oid | 返回值的数据类型 | | `proargtypes` | `oidvector` | `pg_type`.oid | 一个存放函数参数的数据类型的数组。数组里只包括输入参数(包括`INOUT`和 `VARIADIC`参数),因此代表该函数的调用签名(接口)。 | | `proallargtypes` | `oid[]` | `pg_type`.oid | 一个包含函数参数的数据类型的数组。数组里包括所有参数的类型(包括`OUT` 和`INOUT`参数);不过,如果所有参数都是`IN`参数, 那么这个字段就会是空。请注意数组下标是以 1 为起点的,而因为历史原因, `proargtypes`的下标起点为 0 。 | | `proargmodes` | `char[]` | 一个保存函数参数模式的数组,编码如下:`i`表示`IN`参数, `o`表示`OUT`参数,`b`表示`INOUT`参数, `v`表示`VARIADIC`参数,`t`表示`TABLE`参数。 如果所有参数都是`IN`参数,那么这个字段为空。请注意, 下标对应的是`proallargtypes`的位置,而不是`proargtypes`。 | | `proargnames` | `text[]` | 一个保存函数参数的名字的数组。没有名字的参数在数组里设置为空字符串。 如果没有一个参数有名字,这个字段将是空。请注意,此数组的下标对应 `proallargtypes`而不是`proargtypes`。 | | `proargdefaults` | `pg_node_tree` | 缺省值的表达式树(用`nodeToString()`表示)。 是和`pronargdefaults`参数一起列出的,对应最后`_N_`个_输入_ 参数(也就是,最后`_N_`个`proargtypes`位置)。 如果没有有缺省的参数,那么这个字段为null。 | | `prosrc` | `text` | 这个字段告诉函数处理器如何调用该函数。它实际上对于解释语言来说就是函数的源程序, 或者一个链接符号,一个文件名,或者是任何其它的东西,具体取决于语言/调用习惯的实现。 | | `probin` | `text` | 关于如何调用该函数的附加信息。同样,其含义也是和语言相关的。 | | `proconfig` | `text[]` | 函数的运行时配置变量的本地设置 | | `proacl` | `aclitem[]` | 访问权限;参阅[GRANT](#calibre_link-19)和[REVOKE](#calibre_link-20)获取细节。 | 对于内置和动态加载得编译函数,`prosrc`包含函数的 C 语言名字(链接符号)。 对于所有其它当前已知的语言类型,`prosrc`包含该函数的源文本。 `probin`除了用于动态加载的 C 函数之外没有其它用途, 这个时候它给出包含给函数的共享库的文件名。