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