CREATE FUNCTION
Name
CREATE FUNCTION
Synopsis
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [
RETURNS rettype
AS
LANGUAGE
[ WITH ( attribute [
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [
RETURNS rettype
AS
LANGUAGE langname
[ WITH ( attribute [
描述
CREATE FUNCTION定義一個新的函數. CREATE OR REPLACE FUNCTION 將要麼創建一個新函數
參數
name
要創建的函數名字.這個名字可以不是唯一的
argtype
該函數的數據類型(如果有).輸入類型可以是基本類型
rettype
返回數據類型.輸出類型可以聲明為一個基本類型
definition
一個定義函數的字串
obj_file
這個形式的 AS 子句用於在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名
langname
可以是 SQL
attribute
一段可選的有關該函數的信息
創建該函數的用戶成為該函數所有者.
下面的屬性可以出現在 WITH 子句裡∶
iscachable
Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說
isstrict
isstrict 表明如果它的任何參數是 NULL
注意
請參閱 PostgreSQL 程序員手冊 關於通過函數擴展 PostgreSQL 的章節獲取更多關於書寫外部函數的信息.
我們允許你將完整的 SQL 類型語法用於 輸入參數和返回值.不過
PostgreSQL 允許函數 重載
兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤
類似的還有
如果重復調用 CREATE FUNCTION
使用 DROP FUNCTION 刪除一個用戶定義函數.
要更新現存函數的定義
如果你刪除然後重新創建一個函數
例子
要創建一個簡單的 SQL 函數∶
CREATE FUNCTION one() RETURNS integer
AS
LANGUAGE SQL;
SELECT one() AS answer;
answer
這個例子通過調用一個用戶創建的名為 funcs
CREATE FUNCTION ean_checkdigit(char
AS
CREATE TABLE product (
id char(
eanprefix char(
REFERENCES brandname(ean_prefix)
eancode char(
CONSTRAINT ean CHECK (ean_checkdigit(eanprefix
);
這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函數
CREATE FUNCTION point(complex) RETURNS point
AS
LANGUAGE C;
該函數的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p
p
return p;
}
兼容性 SQL
在 SQL
又見
DROP FUNCTION
CREATE GROUP
CREATE GROUP
Name
CREATE GROUP
Synopsis
CREATE GROUP name [ [ WITH ] option [
這裡 option 可以是∶
SYSID gid
| USER username [
輸入
name
組名
gid
SYSID 子句可以用於選擇 PostgreSQL 裡新組的組標識(group id)
如果沒有聲明這個
username
包括到組裡面的用戶列表
輸出
CREATE GROUP
成功創建組後的返回
描述
CREATE GROUP 將在數據庫節點上創建一個新組
使用 ALTER GROUP修改組成員
用法
創建一個空組
CREATE GROUP staff
創建一個有成員的組
CREATE GROUP marketing WITH USER jonathan
兼容性 SQL
裡沒有 CREATE GROUP
CREATE LANGUAGE
CREATE LANGUAGE
Name
CREATE LANGUAGE
Synopsis
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname
HANDLER call_handler
描述
使用 CREATE LANGUAGE
CREATE LANGUAGE將該語言的名字和一個調用句柄 關聯起來
請注意過程語言是對每個獨立的數據庫而言是自己的. 要讓一種語言缺省時可以為所有數據庫獲得
參數
TRUSTED
TRUSTED 說明對該語言的調用句柄是安全的
PROCEDURAL
這是個沒有用的字.
langname
新的過程化語言的名稱.語言名是大小寫無關的. 一個過程化語言不能覆蓋 PostgreSQL內置的語言.
出於向下兼容的原因
HANDLER call_handler
call_handler是一個以前注冊過的函數的名字
診斷
CREATE
如果語言成功創建
ERROR: PL handler function funcname() doesn
如果沒有找到函數 funcname()
注意
這條命令通常不應該由用戶直接執行. 對於 PostgreSQL 版本裡提供的過程語言
使用 CREATE FUNCTION 命令創建新函數.
使用 DROP LANGUAGE
系統表 pg_language 記錄了更多有關 當前安裝的過程語言的信息.
Table
Attribute | Type | Modifier
lanname | name |
lanispl | boolean |
lanpltrusted | boolean |
lanplcallfoid | oid |
lancompiler | text |
lanname | lanispl | lanpltrusted | lanplcallfoid | lancompiler
internal | f | f |
C | f | f |
sql | f | f |
目前
例子
下面兩條順序執行的命令將注冊一門新的過程語言及其關聯的調用句柄.
CREATE FUNCTION plsample_call_handler () RETURNS opaque
AS
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
兼容性 SQL
CREATE LANGUAGE是 PostgreSQL 擴展.
歷史
CREATE LANGUAGE命令第一次出現在 PostgreSQL
又見
createlang
CREATE OPERATOR
CREATE OPERATOR
Name
CREATE OPERATOR
Synopsis
CREATE OPERATOR name ( PROCEDURE = func_name
[
] [
[
[
[
輸入
name
要定義的操作符
func_name
用於實現該操作符的函數
lefttype
如果存在的話
righttype
如果存在的話
com_op
該操作符對應的交換(commutator)操作符
neg_op
對應的負操作符
res_proc
此操作符約束選擇性計算函數
join_proc
此操作符連接選擇性計算函數
HASHES
表明此操作符支持哈希(散列)連接
left_sort_op
如果此操作符支持融合連接(join)
right_sort_op
如果此操作符支持融合連接(join)
輸出
CREATE
成功創建操作符後的返回信息.
描述
CREATE OPERATOR定義一個新的操作符
操作符 name 是一個最多NAMEDATALEN
+
你選擇名字的時候有幾個限制
一個多字符的操作符名字不能以
~ ! @ # % ^ & | ` ? $
例如
注意: 當使用非 SQL
操作符
至少需要定義一個 LEFTARG 或 RIGHTARG. 對於雙目操作符來說
同樣
如果存在換向操作符則必須指明
box
轉換到
MYBOXES
這就允許執行代碼總是使用後面的形式而某種程度上簡化了查詢優化器.
類似地
NOT MYBOXES
簡化成
MYBOXES
如果提供了一個交換操作符名稱
HASHES
類似的
如果發現有其他聯合策略可用
RESTRICT 和 JOIN 選項幫助優化器計算結果的尺寸大小.如果像下面的語句
MYBOXES
在判斷條件中出現
類似的
函數
my_procedure_
和操作符
MYBOXES
之間的區別是 PostgreSQL 試圖優化操作符並且可以決定使用索引來縮小相關操作符的搜索區間.但是
注意
請參閱 PostgreSQL 用戶手冊 中操作符章節獲取更多信息.請使用 DROP OPERATOR 從數據庫中刪除用戶定義操作符.
用法
下面命令定義一個新操作符
CREATE OPERATOR === (
LEFTARG = box
RIGHTARG = box
PROCEDURE = area_equal_procedure
COMMUTATOR = ===
NEGATOR = !==
RESTRICT = area_restriction_procedure
JOIN = area_join_procedure
HASHES
SORT
SORT
);
兼容性 SQL
CREATE OPERATOR是 PostgreSQL 擴展. 在中沒有 CREATE OPERATOR 語句.
CREATE RULE
CREATE RULE
Name
CREATE RULE
Synopsis
CREATE RULE name AS ON event
TO object [ WHERE condition ]
DO [ INSTEAD ] action
這裡 action 可以是
NOTHING
|
query
|
( query ; query
|
[ query ; query
輸入
name
創建的規則名.
event
事件是 SELECT
object
對象是 table 或 lumn.(目前只有 table 形式實際上是實現了的.
condition
任意 SQL 布爾條件表達式.條件表達式除了引用 new 和 old 之外不能引用任何表.
query
組成 action 的查詢可以是任何 SQL SELECT
在 condition 和 action 裡
輸出
CREATE
成功創建規則後的返回信息.
描述
PostgreSQL 規則系統 允許我們在從數據庫或表中更新
規則的語意是在一個單獨的記錄正被訪問
規則的 action 部分可以由一條或者多條查詢組成.要寫多個查詢
規則的 action 部分 執行的時候帶有和觸發動作的用戶命令相同的命令和事務標識符.
規則和視圖
目前
CREATE VIEW 創建一個虛擬表(沒有下層的存儲) 以及相關的 ON SELECT 規則.系統不允許對視圖進行更新
如果你想在視圖更新上使用條件規則
注意
為了在表上定義規則
有一件很重要的事情是要避免循環規則. 比如
CREATE RULE bad_rule_combination_
ON SELECT TO emp
DO INSTEAD
SELECT * FROM toyemp;
CREATE RULE bad_rule_combination_
ON SELECT TO toyemp
DO INSTEAD
SELECT * FROM emp;
下面這個對 EMP 的查詢企圖將導致 PostgreSQL 產生一個錯誤信息
SELECT * FROM emp;
目前
CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
UPDATE mytable SET name =
裡
兼容性 SQL
CREATE RULE語句是 PostgreSQL 語言的擴展. 在裡沒有CREATE RULE 語句.
CREATE SEQUENCE
CREATE SEQUENCE
Name
CREATE SEQUENCE
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ]
輸入
TEMPORARY 或 TEMP
如果聲明了這個修飾詞
seqname
將要創建的序列號名.
increment
INCREMENT increment 子句是可選的.一個正數將生成一個遞增的序列
minvalue
可選的子句 MINVALUE minvalue 決定一個序列可生成的最小值.缺省分別是遞增序列為
maxvalue
使用可選子句 MAXVALUE maxvalue 決定序列的最大值.缺省的分別是遞增為
start
可選的 START start 子句 使序列可以從任意位置開始.缺省初始值是遞增序列為 minvalue 遞減序列為 maxvalue
cache
CACHE cache 選項使序列號預分配並且為快速訪問存儲在內存裡面. 最小值(也是缺省值)是
CYCLE
可選的 CYCLE 關鍵字可用於使序列到達 最大值(maxvalue) 或 最小值(minvalue) 時可復位並繼續下去.如果達到極限
輸出
CREATE
命令成功執行的返回信息.
ERROR: Relation
如果聲明的序列已經存在.
ERROR: DefineSequence: MINVALUE (start) can
如果聲明的初始值超出范圍
ERROR: DefineSequence: START value (start) can
如果聲明的初始值超出范圍
ERROR: DefineSequence: MINVALUE (min) can
如果最小值和最大值不連貫.
描述
CREATE SEQUENCE將向當前數據庫裡增加一個新的序列號生成器. 包括創建和初始化一個新的名為 seqname的 單行表.生成器將為使用此命令的用戶
在序列創建後
盡管你不能直接更新一個序列
SELECT * FROM seqname;
檢查一個序列的參數和當前狀態.特別是序列的 last_value 字段顯示了任意後端進程分配的最後的數值. (當然
Caution
如果用語序列對象的cache 設置大於一
注意
使用 DROP SEQUENCE 語句來刪除序列.
序列是基於 bigint 運算的
如果 cache 大於一
用法
創建一個叫 serial的遞增序列
CREATE SEQUENCE serial START
從此序列中選出下一個數字
SELECT nextval (
nextval
在一個 INSERT 中使用此序列
INSERT INTO distributors VALUES (nextval(
在一個 COPY FROM 後更新序列
BEGIN;
COPY distributors FROM
SELECT setval(
END;
兼容性 SQL
CREATE SEQUENCE是 PostgreSQL 語言擴展. 在裡沒有 CREATE SEQUENCE 語句.
CREATE TABLE AS
CREATE TABLE AS
Name
CREATE TABLE AS
Synopsis
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [
AS query
描述
CREATE TABLE AS創建一個表並且用來自 SELECT 命令計算出來的數據填充該表. 該表的字段和 SELECT 輸出字段 的名字及類型相關.(只不過你可以通過明確地給出一個字段名字 列表來覆蓋 SELECT 的字段名).
CREATE TABLE AS和創建視圖有點象
這條命令和 SELECT INTO有相同的功能
參數
[LOCAL] TEMPORARY 或 [LOCAL] TEMP
如果聲明了這個選項
LOCAL 關鍵字是可選的.
table_name
要創建的表名.這個表不能是已經存在的. 不過
column_name
字段的名稱.多字段的名稱可以用逗號分隔的字段名列表聲明. 如果沒有提供字段名子
query
有效的查詢語句(也就是一條 SELECT 命令)
診斷
請參考 CREATE TABLE和 SELECT 獲取可能的輸出的概要.
注意
這條命令從功能上等效於 SELECT INTO
兼容性 SQL
這條命令是根據 Oracle 的一個特性 制作的.在 或 SQL
歷史
自 PostgreSQL
又見
CREATE TABLE
From:http://tw.wingwit.com/Article/program/Oracle/201311/16722.html