Man page - create_function(7)
Manual
CREATE FUNCTION
NAMESYNOPSIS
DESCRIPTION 描 述
PARAMETERS 参 数
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 兼 容 性
SEE ALSO 参 见
译 者
跋
NAME
CREATE FUNCTION - 定 义 一 个 新 函 数
SYNOPSIS
CREATE [ OR
REPLACE ] FUNCTION
name
( [
argtype
[, ...] ]
)
RETURNS
rettype
{ LANGUAGE
langname
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
| AS ’
definition
’
| AS ’
obj_file
’,
’
link_symbol
’
} ...
[ WITH (
attribute
[, ...] ) ]
DESCRIPTION 描 述
CREATE FUNCTION 定 义 一 个 新 的 函 数 。 CREATE OR REPLACE FUNCTION 将 要 么 创 建 一 个 新 函 数 , 要 么 替 换 现 有 的 定 义 。
如 果 包 含 了 一 个 模 式 名 , 那 么 函 数 就 在 指 定 的 模 式 中 创 建 。 否 则 它 会 在 当 前 模 式 中 创 建 。 新 函 数 的 名 字 不 能 和 同 一 个 模 式 中 的 任 何 带 有 同 样 参 数 类 型 的 函 数 同 名 。 不 过 , 参 数 类 型 不 同 的 函 数 可 以 同 名 ( 这 叫 做 重 载 ) 。
要 更 新 一 个 现 有 函 数 的 定 义 , 使 用 CREATE OR REPLACE FUNCTION。 我 们 不 能 用 这 个 方 法 修 改 一 个 函 数 的 名 字 或 者 参 数 类 型 ( 如 果 你 这 么 干 , 那 么 你 就 会 创 建 一 个 新 的 , 不 同 的 函 数 ) 。 同 样 , CREATE OR REPLACE FUNCTION 也 不 会 允 许 你 修 改 一 个 现 有 函 数 的 返 回 类 型 。 要 做 这 些 事 情 , 你 必 须 删 除 并 重 新 创 建 函 数 。
如 果 你 删 除 然 后 重 建 一 个 函 数 , 新 函 数 和 旧 的 将 是 不 同 的 实 体 ; 你 会 破 坏 现 有 规 则 , 视 图 , 触 发 器 等 等 。 使 用 CREATE OR REPLACE FUNCTION 可 以 在 不 破 坏 引 用 该 函 数 的 对 象 的 前 提 下 修 改 函 数 定 义 。
创 建 这 个 函 数 的 用 户 成 为 函 数 的 所 有 者 。
PARAMETERS 参 数
|
name |
要 创 建 的 函 数 名 字 。
argtype
该 函 数 的 数 据 类 型 ( 可 以 有 模 式 修 饰 ) 。 如 果 有 的 话 , 参 数 类 型 可 以 是 基 本 类 型 , 也 可 以 是 复 合 类 型 , 域 类 型 , 或 者 和 一 个 现 有 字 段 相 同 的 类 型 。
一 个 字 段 的 类 型 是 用 tablename . columnname %TYPE 表 示 的 ; 使 用 这 个 东 西 可 以 帮 助 函 数 独 立 于 表 定 义 的 修 改 。
根 据 实 现 语 言 的 不 同 , 我 们 还 可 以 在 这 上 面 声 明 "伪 类 型 ", 比 如 cstring。 伪 类 型 表 示 实 际 的 参 数 类 型 要 么 是 没 有 完 整 地 声 明 , 要 么 是 在 普 通 的 SQL 数 据 类 型 之 外 。
rettype
返 回 数 据 类 型 。 输 出 类 型 可 以 声 明 为 一 个 基 本 类 型 , 复 合 类 型 , 域 类 型 , 或 者 从 现 有 字 段 拷 贝 。 参 阅 上 面 argtype 的 描 述 获 取 如 何 引 用 一 个 现 有 类 型 的 信 息 。
根 据 实 现 语 言 的 不 同 , 我 们 还 可 以 在 这 上 面 声 明 "伪 类 型 ", 比 如 cstring。 SETOF 修 饰 词 表 示 该 函 数 将 返 回 一 套 条 目 , 而 不 是 一 条 条 目 。
langname
用 以 实 现 函 数 的 语 言 的 名 字 。 可 以 是 SQL, C, internal, 或 者 是 用 户 定 义 的 过 程 语 言 名 字 。 ( 又 见 createlang。 ) 为 了 保 持 向 下 兼 容 , 该 名 字 可 以 用 单 引 号 包 围 。
IMMUTABLE
|
STABLE |
VOLATILE
这 些 属 性 告 诉 系 统 把 对 该 函 数 的 多 次 调 用 替 换 成 一 次 是 否 安 全 。 主 要 用 于 运 行 时 优 化 。 至 少 应 该 声 明 一 个 选 择 。 如 果 任 何 一 个 都 没 有 出 现 , 那 么 VOLATILE 是 缺 省 假 设 。
IMMUTABLE 表 示 该 函 数 在 给 出 同 样 的 参 数 值 时 总 是 返 回 相 同 的 结 果 ; 也 就 是 说 , 它 不 做 数 据 库 查 找 或 者 是 使 用 那 些 并 没 有 直 接 出 现 在 其 参 数 列 表 里 面 的 信 息 。 如 果 给 出 这 个 选 项 , 那 么 任 何 带 着 全 部 是 常 量 参 数 对 该 函 数 的 调 用 都 将 立 即 替 换 为 该 函 数 的 值 。
STABLE 表 示 在 一 次 表 扫 描 里 , 对 相 同 参 数 值 , 该 函 数 将 稳 定 返 回 相 同 的 值 , 但 是 它 的 结 果 可 能 在 不 同 SQL 语 句 之 间 变 化 。 这 个 选 项 对 那 些 结 果 倚 赖 数 据 库 查 找 , 参 数 变 量 ( 比 如 当 前 时 区 ) , 等 等 的 函 数 是 很 合 适 的 。 还 要 注 意 current_timestamp 族 函 数 是 stable (稳 定 )的 , 因 为 它 们 的 值 在 一 次 事 务 中 不 会 变 化 。
VOLATILE 表 示 该 函 数 值 甚 至 可 以 在 一 次 表 扫 描 内 改 变 , 因 此 不 会 做 任 何 优 化 。 很 少 数 据 库 函 数 在 这 个 概 念 上 是 易 变 的 ; 一 些 例 子 是 random(), currval(), timeofday()。 请 注 意 任 何 有 副 作 用 的 函 数 都 必 需 列 为 易 变 类 , 即 使 其 结 果 相 当 有 规 律 也 应 该 这 样 , 这 样 才 能 避 免 它 被 优 化 ; 一 个 例 子 就 是 setval()。
CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
|
STRICT |
CALLED ON NULL INPUT ( 缺 省 ) 表 明 该 函 数 在 自 己 的 某 些 参 数 是 空 值 的 时 候 还 是 可 以 按 照 正 常 的 方 式 调 用 。 剩 下 的 事 情 是 函 数 的 作 者 必 须 负 责 检 查 空 值 以 及 相 应 地 做 出 反 应 。 |
RETURNS NULL ON NULL INPUT 或 STRICT 表 明 如 果 它 的 任 何 参 数 是 NULL, 此 函 数 总 是 返 回 NULL。 如 果 声 明 了 这 个 参 数 , 则 如 果 存 在 NULL 参 数 时 不 会 执 行 该 函 数 ; 而 只 是 自 动 假 设 一 个 NULL 结 果 。
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER 表 明 该 函 数 将 带 着 调 用 它 的 用 户 的 权 限 执 行 。 这 是 缺 省 。 SECURITY DEFINER 声 明 该 函 数 将 以 创 建 它 的 用 户 的 权 限 执 行 。
关 键 字 EXTERNAL 的 目 的 是 和 SQL 兼 容 , 但 是 我 们 和 SQL 不 同 的 是 , 这 个 特 性 不 仅 仅 适 用 于 外 部 的 函 数 , 所 以 它 是 可 选 的 。
definition
一 个 定 义 函 数 的 字 串 ; 含 义 取 决 于 语 言 。 它 可 以 是 一 个 内 部 函 数 名 字 , 一 个 指 向 某 个 目 标 文 件 的 路 径 , 一 个 SQL 查 询 , 或 者 一 个 用 过 程 语 言 写 的 文 本 。
obj_file , link_symbol
这 个 形 式 的 AS 子 句 用 于 在 函 数 的 C 源 文 件 里 的 函 数 名 字 和 SQL 函 数 的 名 字 不 同 的 时 候 可 动 态 装 载 C 语 言 函 数 。 字 串 obj_file 是 包 含 可 动 态 装 载 的 对 象 的 文 件 名 , 而 link_symbol 是 函 数 的 链 接 符 号 , 也 就 是 该 函 数 在 C 源 文 件 里 的 名 字 。 如 果 省 略 了 链 接 符 号 , 那 么 就 假 设 它 和 被 定 义 的 SQL 函 数 同 名 。
attribute
历 史 遗
留 的 函 数 可 选
信 息 。 下 面 的
属 性 可 以 在 此
出 现 :
isStrict
等 效 于 STRICT 或 者 RETURNS NULL ON NULL INPUT
isCachable
isCachable 是 IMMUTABLE 的 过 时 的 等 效 物 ; 不 过 出 于 向 下 兼 容 , 我 们 仍 然 接 受 它 。
属 性 名 是 大 小 写 无 关 的 。
NOTES 注 意
请 参 阅 ‘‘User-Defined Functions’’ 获 取 更 多 关 于 书 写 函 数 的 信 息 。
我 们 允 许 你 将 完 整 的 SQL 类 型 语 法 用 于 输 入 参 数 和 返 回 值 。 不 过 , 有 些 类 型 声 明 的 细 节 ( 比 如 , numeric 类 型 的 精 度 域 ) 是 由 下 层 函 数 实 现 负 责 的 , 并 且 会 被 CREATE FUNCTION 命 令 悄 悄 地 吞 掉 。 ( 也 就 是 说 , 不 再 被 识 别 或 强 制 ) 。
PostgreSQL 允 许 函 数 重 载 ; 也 就 是 说 , 同 一 个 函 数 名 可 以 用 于 几 个 不 同 的 函 数 , 只 要 它 们 的 参 数 可 以 区 分 它 们 。 不 过 , 所 有 函 数 的 C 名 字 必 须 不 同 , 也 就 是 说 你 必 须 给 予 重 载 的 C 函 数 不 同 的 C 名 字 ( 比 如 , 使 用 参 数 类 型 作 为 C 名 字 的 一 部 分 ) 。
如 果 重 复 调 用 CREATE FUNCTION, 并 且 都 指 向 同 一 个 目 标 文 件 , 那 么 该 文 件 只 装 载 一 次 。 要 卸 载 和 恢 复 装 载 该 文 件 ( 可 能 是 在 开 发 过 程 中 ) , 你 可 以 使 用 LOAD [ load (7)] 命 令 。
使 用 DROP FUNCTION 删 除 一 个 用 户 定 义 函 数 。
函 数 定 义 里 面 的 任 何 单 引 号 或 者 反 斜 杠 都 必 须 用 写 双 份 的 方 式 逃 逸 。
要 能 定 义 函 数 , 用 户 必 须 对 该 语 言 有 USAGE 权 限 。
EXAMPLES 例 子
这 里 是 一 个 简 单 的 例 子 , 用 于 帮 助 你 开 始 掌 握 这 个 命 令 。 更 多 信 息 和 例 子 , 参 阅 ‘‘User-Defined Functions’’。
CREATE FUNCTION
add(integer, integer) RETURNS integer
AS ’select $1 + $2;’
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
COMPATIBILITY 兼 容 性
在 SQL99 里 的 确 定 义 了 一 个 CREATE FUNCTION PostgreSQL 的 和 它 类 似 但 是 不 兼 容 。 这 个 属 性 是 不 可 移 植 的 , 可 以 使 用 的 不 同 语 言 也 是 如 此 。
SEE ALSO 参 见
ALTER FUNCTION [ alter_function (7)], DROP FUNCTION [ drop_function (7)], GRANT [ grant (7)], LOAD [ load (7)], REVOKE [ revoke (7)], createlang (1)
译 者
Postgresql 中 文 网 站 何 伟 平 <laser@pgsqldb.org>
跋
本
页 面 中 文 版 由
中 文 man 手 册 页 计
划 提 供 。
中 文 man 手 册 页 计
划 :
https://github.com/man-pages-zh/manpages-zh