熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

超詳細sql大全(3)

2013-11-13 15:26:44  來源: Oracle 

  

  CREATE FUNCTION

  Name

  CREATE FUNCTION    定義一個新函數

  Synopsis

  CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [ ] ] )

  RETURNS rettype

  AS definition

  LANGUAGE langname

  [ WITH ( attribute [ ] ) ]

  CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [ ] ] )

  RETURNS rettype

  AS obj_file link_symbol

  LANGUAGE langname

  [ WITH ( attribute [ ] ) ]

  描述

  CREATE FUNCTION定義一個新的函數. CREATE OR REPLACE FUNCTION 將要麼創建一個新函數要麼替換現有的定義.

  參數

  name

  要創建的函數名字.這個名字可以不是唯一的 因為函數可以重載膽識同名的函數必須有不同的參數類型.

  argtype

  該函數的數據類型(如果有).輸入類型可以是基本類型也可以是復合類型opaque或者和一個現有字段相同的類型. Opaque 表示該函數接受非 SQL 類型比如 char *. 一個字段的類型是用 lumnname%TYPE 表示的使用這個東西可以幫助函數獨立於表定義的修改.

  rettype

  返回數據類型.輸出類型可以聲明為一個基本類型復合類型 setof 類型opaque 或者和現有字段同類型. setof 修飾詞表示該函數將返回一套條目而不是一條條目.返回類型聲明為 opaque 的函數不返回數值.它們不能直接調用觸發器函數可以利用這個 特性.

  definition

  一個定義函數的字串含義取決於語言.它可以是一個內部函數名字 一個指向某個目標文件的路徑一個 SQL 查詢或者一個用過程語言 寫的文本.

  obj_file link_symbol

  這個形式的 AS 子句用於在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名而 link_symbol 是對象的聯接符號也就是該函數在 C 源文件列的名字.

  langname

  可以是 SQLC internal或者 plname這裡的 plname 是一種已創建過程語言的名字. 參閱 CREATE LANGUAGE獲取細節. 為了保持向下兼容該名字可以用單引號包圍.

  attribute

  一段可選的有關該函數的信息用於優化.見下文獲取細節.

  創建該函數的用戶成為該函數所有者.

  下面的屬性可以出現在 WITH 子句裡∶

  iscachable

  Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說 它不做數據庫查找或者是使用沒有直接在它的參數列表出現的信息) 優化器使用 iscachable 來認知對該函數的調用進行預先計算是否安全

  isstrict

  isstrict 表明如果它的任何參數是 NULL此函數總是返回 NULL. 如果聲明了這個屬性則如果存在 NULL 參數時不會執行該函數 而只是自動假設一個 NULL 結果.如果沒有聲明 isstrict 該函數將為 NULL 輸入調用並進行處理. 那麼剩下的事就是函數作者的責任來檢查 NULL 是否必須並且做相應響應.

  注意

  請參閱 PostgreSQL 程序員手冊 關於通過函數擴展 PostgreSQL 的章節獲取更多關於書寫外部函數的信息.

  我們允許你將完整的 SQL 類型語法用於 輸入參數和返回值.不過有些類型聲明的細節(比如 numeric 類型的精度域)是由下層函數實現負責的 並且會被 CREATE FUNCTION 命令悄悄地吞掉. (也就是說不再被識別或強制).

  PostgreSQL 允許函數 重載也就是說同一個函數名可以用於幾個不同的函數 只要它們的參數可以區分它們不過這個功能在用於 internal(內部)和 C 語言 的函數時要小心

  兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤 要解決這個問題給它們賦予不同的 C 名稱(例如使用參數類型做為 C 名稱的一部分)然後在 CREATE FUNCTION 的 AS 子句裡面聲明這些名字 如果 AS 子句為空那麼 CREATE FUNCTION 假設函數的 C 名稱與SQL名稱一樣

  類似的還有如果用多個 C 語言函數重載 SQL 函數 給每個 C 語言函數的實例一個獨立的名稱然後使用 CREATE FUNCTION 語法裡的 AS 句的不同形式來選擇每個重載的 SQL 函數的正確的 C 語言實現.

  如果重復調用 CREATE FUNCTION並且都指向同一個目標文件那麼該文件只裝載一次.要卸載和恢復裝載 該文件(可能是在開發過程中)你可以使用 LOAD命令.

  使用 DROP FUNCTION 刪除一個用戶定義函數.

  要更新現存函數的定義用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法改變一個函數的名字或者參數類型 (如果你這麼干你只是會創建一個新的不同的函數). 同樣CREATE OR REPLACE FUNCTION 也不會 讓你改變一個現存函數的返回類型.要干這些事你必須刪除並 重新創建該函數.

  如果你刪除然後重新創建一個函數新函數和舊的並非相同實體 你會破壞現存的引用了原有函數的規則視圖觸發器等等.使用 CREATE OR REPLACE FUNCTION 可以改變一個函數的定義而又不會破壞引用該函數的對象.

  例子

  要創建一個簡單的 SQL 函數∶

  CREATE FUNCTION one() RETURNS integer

  AS SELECT AS RESULT;

  LANGUAGE SQL;

  SELECT one() AS answer;

  answer

  

  

  這個例子通過調用一個用戶創建的名為 funcsso (擴展名因平台而異)的共享庫過程創建一個 C 函數. 該共享庫文件應該位於服務器的動態搜索路徑裡.該路徑計算一個檢測位並且如果函數參數裡的檢測位 正確就返回一個 TRUE .這些可以通過用一個 CHECK 約束實現的.

  CREATE FUNCTION ean_checkdigit(char char) RETURNS boolean

  AS funcs LANGUAGE C;

  CREATE TABLE product (

  id        char() PRIMARY KEY

  eanprefix char() CHECK (eanprefix ~ []{}[]{})

  REFERENCES brandname(ean_prefix)

  eancode   char() CHECK (eancode ~ []{})

  CONSTRAINT ean    CHECK (ean_checkdigit(eanprefix eancode))

  );

  這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函數該函數是用一個從 C 源代碼編譯的 動態裝載的對象來實現的(我們演示了使用聲明共享目標文件 的准確路徑名的過時方法). 對於 PostgreSQL 而言 要自動尋找類型轉換函數SQL 函數必須和返回類型同名因而重載是不可避免的 該函數名通過使用 SQL定義裡 AS 子句的第二種類型來重載

  CREATE FUNCTION point(complex) RETURNS point

  AS /home/bernie/pgsql/lib/complexso complex_to_point

  LANGUAGE C;

  該函數的 C 聲明可以是∶

  Point * complex_to_point (Complex *z)

  {

  Point *p;

  p = (Point *) palloc(sizeof(Point));

  p>x = z>x;

  p>y = z>y;

  return p;

  }

  兼容性 SQL

  在 SQL 裡的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這個屬性是不可移植的可以使用的不同語言也是如此.

  又見

  DROP FUNCTION LOAD PostgreSQL程序員手冊

  

  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修改組成員DROP GROUP刪除一個組

  用法

  創建一個空組

  CREATE GROUP staff

  創建一個有成員的組

  CREATE GROUP marketing WITH USER jonathan david

  兼容性 SQL

  裡沒有 CREATE GROUP Roles 在概念上與組類似

  

  CREATE LANGUAGE

  CREATE LANGUAGE

  Name

  CREATE LANGUAGE 定義一種新的過程語言

  Synopsis

  CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname

  HANDLER call_handler

  描述

  使用 CREATE LANGUAGE 一個PostgreSQL 用戶可以在 PostgreSQL裡注冊一個新的語言.因而函數和觸發器過程可以用這種新語言定義.要注冊新 語言用戶必須具有 PostgreSQL 超級用戶權限.

  CREATE LANGUAGE將該語言的名字和一個調用句柄 關聯起來而該調用句柄負責執行該語言書寫的函數.請參考程序員手冊獲取有關語言調用句柄的 更多信息.

  請注意過程語言是對每個獨立的數據庫而言是自己的. 要讓一種語言缺省時可以為所有數據庫獲得那你應該把它安裝到 template 數據庫裡.

  參數

  TRUSTED

  TRUSTED 說明對該語言的調用句柄是安全的也就是說它不會提供給非特權用戶任何繞過訪問限制的能力. 如果忽略這個關鍵字只有具有 PostgreSQL 超級用戶權限的人可以使用這個語言創建新的函數.

  PROCEDURAL

  這是個沒有用的字.

  langname

  新的過程化語言的名稱.語言名是大小寫無關的. 一個過程化語言不能覆蓋 PostgreSQL內置的語言.

  出於向下兼容的原因這個名字可以用單引號包圍.

  HANDLER call_handler

  call_handler是一個以前注冊過的函數的名字該函數將被調用來執行這門過程語言寫的函數.過程語言的調用句柄必須用一種編譯語言書寫比如 C調用風格必須 是版本 的調用風格並且在 PostgreSQL 裡注冊為不接受參數並且返回 opaque 類型的函數 (opaque 是用於未聲明或未定義類型的占位符). undefined types

  診斷

  CREATE

  如果語言成功創建返回此信息.

  ERROR: PL handler function funcname() doesnt exist

  如果沒有找到函數 funcname() 則返回此信息.

  注意

  這條命令通常不應該由用戶直接執行. 對於 PostgreSQL 版本裡提供的過程語言我們應該使用 createlang腳本 它將為我們安裝正確的調用句柄. (createlang 也會在內部調用 CREATE LANGUAGE.)

  使用 CREATE FUNCTION 命令創建新函數.

  使用 DROP LANGUAGE或者更好是 droplang腳本刪除一個過程語言.

  系統表 pg_language 記錄了更多有關 當前安裝的過程語言的信息.

  Table pg_language

  Attribute   | Type   | Modifier

  ++

  lanname       | name    |

  lanispl       | boolean |

  lanpltrusted | boolean |

  lanplcallfoid | oid     |

  lancompiler   | text    |

  lanname   | lanispl | lanpltrusted | lanplcallfoid | lancompiler

  ++++

  internal    | f       | f            |             | n/a

  C           | f       | f            |             | /bin/cc

  sql         | f       | f            |             | postgres

  目前一種過程語言創建之後它的定義就不能再更改.

  例子

  下面兩條順序執行的命令將注冊一門新的過程語言及其關聯的調用句柄.

  CREATE FUNCTION plsample_call_handler () RETURNS opaque

  AS $libdir/plsample

  LANGUAGE C;

  CREATE LANGUAGE plsample

  HANDLER plsample_call_handler;

  兼容性 SQL

  CREATE LANGUAGE是 PostgreSQL 擴展.

  歷史

  CREATE LANGUAGE命令第一次出現在 PostgreSQL

  又見

  createlang CREATE FUNCTION droplang DROP LANGUAGE PostgreSQL 程序員手冊

  

  CREATE OPERATOR

  CREATE OPERATOR

  Name

  CREATE OPERATOR    定義一個新的操作符

  Synopsis

  CREATE OPERATOR name ( PROCEDURE = func_name

  [ LEFTARG = lefttype

  ] [ RIGHTARG = righttype ]

  [ COMMUTATOR = com_op ] [ NEGATOR = neg_op ]

  [ RESTRICT = res_proc ] [ JOIN = join_proc ]

  [ HASHES ] [ SORT = left_sort_op ] [ SORT = right_sort_op ] )

  輸入

  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. 定義該操作符的用戶成為其所有者.

  操作符 name 是一個最多NAMEDATALEN 長的(缺省為 個)下列字符組成的字串

  + * / < > = ~ ! @ # % ^ & | ` ? $

  你選擇名字的時候有幾個限制

  $: 不能定義為單字符操作符 但是它們可以是一個多字符操作符的名稱的一部分.

  /* 不能在操作符名字的任何地方出現 因為它們會被認為是一個注釋的開始.

  一個多字符的操作符名字不能以 + 結尾 除非該名字還包含至少下面字符之一

  ~ ! @ # % ^ & | ` ? $

  例如 @ 是一個允許的操作符名 但 * 不是. 這個限制允許 PostgreSQL 分析 SQL有問題的查詢而不要求在符號之間有空白.

  注意: 當使用非 SQL標准操作符名時 你通常將需要用空白把聯接的操作符分離開以避免含混.例如如果你定義了一個左目操作符名為 @你不能寫 X*@Y你必須寫成 X* @Y 以保證 PostgreSQL 把它讀做兩個操作符而不是一個.

  操作符 != 在輸入時映射成 <> 因此這兩個名稱總是相等的.

  至少需要定義一個 LEFTARG 或 RIGHTARG. 對於雙目操作符來說兩者都需要定義. 對右目操作符來說只需要定義 LEFTARG 而對於左目操作符來說只需要定義 RIGHTARG.

  同樣 func_name 過程必須已經用 CREATE FUNCTION 定義過 而且必須定義為接受正確數量的指定類型參數(一個或是兩個).

  如果存在換向操作符則必須指明這樣 PostgreSQL 可以按它的意願轉換操作符的方向.例如操作符面積小於 <<< 很有可能有一個轉換操作符面積大於操作符 >>> 因此查詢優化器可以自由的將下面查詢從

  box (() ()) >>> MYBOXESdescription

  轉換到

  MYBOXESdescription <<< box (() ())

  這就允許執行代碼總是使用後面的形式而某種程度上簡化了查詢優化器.

  類似地如果存在負號操作符則也應該聲明 假設一個操作符面積相等 ===存在同樣有一個面積不等操作符 !==. 負號操作符允許查詢優化器將

  NOT MYBOXESdescription === box (() ())

  簡化成

  MYBOXESdescription !== box (() ())

  如果提供了一個交換操作符名稱 PostgreSQL 將在表中查找它.如果找到而且其本身沒有一個交換符那麼交換符表將被更新以當前(最 新)創建的操作符作為它的交換符.這一點一樣適用於負號操作符. 這就允許定義兩個互為交換符或負號符的操作符.第一個操作符應該定義為沒有交換符 或負號符(as appropriate). 當定義第二個操作符時將第一個符號作為交換符或負號符.第一個將因上述的副作用一樣被更新(而獲得交換符 或負號符).(對於PostgreSQL 把兩個操作符指向對方同樣也行

  HASHESSORT 和 SORT 選項將為查詢優化器進行連接查詢時提供支持. PostgreSQL 能夠總是用反復替換來計算一個連接(也就是說處理這樣的子句該子句有兩個元組變量 這兩個變量被一個操作符分開這個操作符返回一個boolean量) [WONG]. 另外 PostgreSQL 可以延著 [SHAP]實現一個散列-連接算法(hashjoin algorithm)但是我們必須知道這個策略是否可行.目前的散列-連接算法只是對代表相等 測試的操作符有效而且數據類型的相等必須意味著類型的表現是按位相等的 (例如一個包含未用的位的數據類型這些位對相等測試沒有影響但卻不能用於哈希連接)HASHES 標記告訴優化器 對這個操作符可以安全地使用哈希連接

  類似的兩目排序操作符告訴查詢優化器一個融合-排序 (mergesort)是否是一個可用的連接策略並且告訴優化器使用哪個操作符來對這兩個操 作數表排序.排序操作符應該只提供給相等操作符 並且它們應該對應用於相應的左邊和右邊數據類型的小於操作符

  如果發現有其他聯合策略可用 PostgreSQL 將更改優化器和運行時系統以利用這些策略並且在定義一個操作符時將需要更多的聲明.幸運的是研究 團隊不經常發明新的聯合策略 而且增加用戶定義聯合策略的方法看來與其實現的復雜性相比是不值得的

  RESTRICT 和 JOIN 選項幫助優化器計算結果的尺寸大小.如果像下面的語句

  MYBOXESdescription <<< box (()())

  在判斷條件中出現那麼 PostgreSQL 將不得不估計 MYBOXES 中滿足該子句的記錄數量的范圍的大小. 函數 res_proc 必需是一個注冊過的函數(也就是說它已經用 CREATE FUNCTION定義過了)它接受一個正確數據的數據類型作為參數返回一個浮點數. 查詢優化器只是簡單的調 用這個函數將參數 (()()) 傳入並且把結果乘以關系(表)尺寸以獲得所需要的記錄的數值

  類似的當操作符的兩個操作數都包含記錄變量時 優化器必須計算聯合結果的尺寸. 函數 join_proc 將返回另一個浮點數這個數就是將兩個表相關 的記錄相乘計算出預期結果的尺寸.

  函數

  my_procedure_ (MYBOXESdescription box (() ()))

  和操作符

  MYBOXESdescription === box (() ())

  之間的區別是 PostgreSQL 試圖優化操作符並且可以決定使用索引來縮小相關操作符的搜索區間.但是對函數將不會有任何優化的動作而且是強制 執行.最後函數可有任意個參數而操作符限於一個或兩個.

  注意

  請參閱 PostgreSQL 用戶手冊 中操作符章節獲取更多信息.請使用 DROP OPERATOR 從數據庫中刪除用戶定義操作符.

  用法

  下面命令定義一個新操作符面積相等用於 BOX 數據類型.

  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 UPDATEDELETE 或 INSERT 之一.

  object

  對象是 table 或 lumn.(目前只有 table 形式實際上是實現了的.

  condition

  任意 SQL 布爾條件表達式.條件表達式除了引用 new 和 old 之外不能引用任何表.

  query

  組成 action 的查詢可以是任何 SQL SELECTINSERT UPDATEDELETE或 NOTIFY 語句之一.

  在 condition 和 action 裡特殊表名字 new 和 old 可以用於指向引用表 ( object) 裡的數值 new 在 ON INSERT 和 ON UPDATE 規則裡 可以指向被插入或更新的新行. old 在 ON UPDATE和 ON DELETE 規則裡可以指向現存的被更新或者刪除的行.

  輸出

  CREATE

  成功創建規則後的返回信息.

  描述

  PostgreSQL 規則系統 允許我們在從數據庫或表中更新 插入或刪除東西時定義一個可選的動作來執行目前規則用於實現表視圖

  規則的語意是在一個單獨的記錄正被訪問更新插入或刪除時 將存在一個舊記錄(用於檢索更新和刪除)和一個新記錄 (用於更新和追加).這時給定事件類型和給定目標對象(表)的所有規則都將被檢查 (順序不定). 如果在 WHERE (如果有)子句裡面所聲明的 condition? 為真那麼 action 部分的規則就被執行. 如果聲明了 INSTEAD那麼 action 就會代替原來的查詢否則如果是 ON INSERT 那麼它在原來的查詢之後執行如果是 ON UPDATE 或者 ON DELETE那麼它在原來的查詢之前執行.在 condition 和 action 裡面 在舊記錄裡字段的數值和/或新記錄裡字段的數值被 old attributename 和 new attributename 代替.

  規則的 action 部分可以由一條或者多條查詢組成.要寫多個查詢用圓括弧或者方括弧 把它們包圍起來. 這樣的查詢將以聲明的順序執行(只是我們不能保證對一個對象的多個規則的執行順序). action 還可以是 NOTHING 表示沒有動作.因此一個 DO INSTEAD NOTHING 規則制止了原來的查詢的運行(當條件為真時) DO NOTHING 規則是沒有用的.

  規則的 action 部分 執行的時候帶有和觸發動作的用戶命令相同的命令和事務標識符.

  規則和視圖

  目前ON SELECT 規則必須是無條件的 INSTEAD 規則並且 必須有一個由一條 SELECT 查詢組成的動作.因此一條 ON SELECT 規則有效地把對象表轉成視圖它的可見內容 是規則的 SELECT 查詢返回的記錄而不是存儲在表中的內容(如果有的話). 我們認為寫一條 CREATE VIEW 命令比創建一個表然後定義一條 ON SELECT 規則在上面的風格要好.

  CREATE VIEW 創建一個虛擬表(沒有下層的存儲) 以及相關的 ON SELECT 規則.系統不允許對視圖進行更新 因為它知道在視圖上沒有真正的表.你可以創建一個可以更新的視圖的幻覺 方法是在視圖上定義 ON INSERTON UPDATE和 ON DELETE 規則 (或者滿足你需要的任何上述規則的子集)用合適的對其它表的更新替換 在視圖上更新的動作.

  如果你想在視圖更新上使用條件規則那麼這裡就有一個補充∶ 對你希望在視圖上允許的每個動作你都必須有一個無條件的 INSTEAD 規則.如果規則是有條件的或者它不是 INSTEAD 那麼系統仍將拒絕執行更新動作的企圖因為它認為它最終會在某種 程度上在虛擬表上執行動作. 如果你想處理條件規則上的所由有用的情況那也可以只需要增加一個無條件的 DO INSTEAD NOTHING 規則確保系統明白它將決不會被 調用來更新虛擬表就可以了.然後把條件規則做成非 INSTEAD 在這種情況下如果它們被觸發那麼它們就增加到缺省的 INSTEAD NOTHING 動作中.

  注意

  為了在表上定義規則你必須有規則定義權限. 用 GRANT 和 REVOKE 修改權限.

  有一件很重要的事情是要避免循環規則. 比如盡管下面兩條規則定義都是 PostgreSQL 可以接受的 select 命令會導致 PostgreSQL 報告 一條錯誤信息因為該查詢循環了太多次

  CREATE RULE bad_rule_combination_ AS

  ON SELECT TO emp

  DO INSTEAD

  SELECT * FROM toyemp;

  CREATE RULE bad_rule_combination_ AS

  ON SELECT TO toyemp

  DO INSTEAD

  SELECT * FROM emp;

  下面這個對 EMP 的查詢企圖將導致 PostgreSQL 產生一個錯誤信息 因為該查詢循環了太多次

  SELECT * FROM emp;

  目前如果一個規則包含一個 NOTIFY 查詢那麼該 NOTIFY 將被 無條件執行 也就是說如果規則不施加到任何行上頭該 NOTIFY 也會被發出.比如

  CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;

  UPDATE mytable SET name = foo WHERE id = ;

  裡一個 NOTIFY 事件將在 UPDATE 的時候發出不管是否有某行的 id = .這是一個實現的限制將來的版本應該修補這個毛病.

  兼容性 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) 時可復位並繼續下去.如果達到極限生成的下一個數據將分別是 最小值(minvalue) 或 最大值(maxvalue).如果沒有 CYCLE那麼在到達極限之後再調用 nextval 將返回錯誤.

  輸出

  CREATE

  命令成功執行的返回信息.

  ERROR: Relation seqname already exists

  如果聲明的序列已經存在.

  ERROR: DefineSequence: MINVALUE (start) cant be >= MAXVALUE (max)

  如果聲明的初始值超出范圍返回此信息.

  ERROR: DefineSequence: START value (start) cant be < MINVALUE (min)

  如果聲明的初始值超出范圍返回此信息.

  ERROR: DefineSequence: MINVALUE (min) cant be >= MAXVALUE (max)

  如果最小值和最大值不連貫.

  描述

  CREATE SEQUENCE將向當前數據庫裡增加一個新的序列號生成器. 包括創建和初始化一個新的名為 seqname的 單行表.生成器將為使用此命令的用戶所有

  在序列創建後你可以使用函數 nextval currval 和 nextval 操作序列.這些函數在用戶手冊中有詳細文檔.

  盡管你不能直接更新一個序列但你可以使用象

  SELECT * FROM seqname;

  檢查一個序列的參數和當前狀態.特別是序列的 last_value 字段顯示了任意後端進程分配的最後的數值. (當然這些值在被打印出來的時候可能已經過時了 如果其它進程 正積極地使用 nextval.)

  Caution

  如果用語序列對象的cache 設置大於一 而且該對象可能被多個後端同時使用就有可能產生不可預料的結果.每個後端 在訪問過序列對象並遞增序列對象的 last_value 後 將分配跟在序列值後面緩存數.這樣該後端在下面的 cache 次nextval調用將使用預分配好的數值 而不對共享對象做任何更新. 所以任何已經分配但在會話中沒有使用的數字 將在會話結束時丟失.而且盡管多個後端保證分配獨立的序列值 當考慮所有的後端時該數值卻有可能是亂序的.(例如設置 cache為 後端 A 可能保留數值 並且返回nextval= 而後端 B 可能保留數值 並在後端 A 生成nextval= 之 前返回 nextval=.)因此 將cache 設為一可以安全地假設nextval的數值是順序生成的 當緩存數設置大於一我 們只能假設nextval值都是獨立的 而不能假設它們都是純粹順序生成的. 同樣last_value將反映由任何後端保留的最 後數值不管它是不是nextval曾返回過的. 另外一個問題是在這樣的序列上執行的 setval 將不會被 其它後端知曉直道它們用光所有預先分配的緩存數值.

  注意

  使用 DROP SEQUENCE 語句來刪除序列.

  序列是基於 bigint 運算的因此其范圍不能超過八字節的 整數范圍().在一些老一點的平台上可能沒有對八字節整數的編譯器支持 這種情況下序列使用普通的 integer 運算(范圍是 到 +).

  如果 cache 大於一那麼每個後端使用其自身的緩存來存儲分配的數字. 已分配但當前會話沒有使用的數字將丟失導致序列裡面出現空洞

  用法

  創建一個叫 serial的遞增序列開始

  CREATE SEQUENCE serial START ;

  從此序列中選出下一個數字

  SELECT nextval (serial);

  nextval

  

  

  在一個 INSERT 中使用此序列

  INSERT INTO distributors VALUES (nextval(serial)nothing);

  在一個 COPY FROM 後更新序列

  BEGIN;

  COPY distributors FROM input_file;

  SELECT setval(serial max(id)) FROM distributors;

  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 計算一次來填充這個新表. 新表不能跟蹤 SELECT 的源表隨後做的變化. 相比之下每次做查詢的時候視圖都重新計算 SELECT.

  這條命令和 SELECT INTO有相同的功能 但是我們建議你多用這條命令因為它不象 SELECT INTO 語法那樣融合和一些其它用法混淆.

  參數

  [LOCAL] TEMPORARY 或 [LOCAL] TEMP

  如果聲明了這個選項則該表作為臨時表創建. 臨時表在會話退出的時候自動刪除 在該臨時表存在的期間(本次會話) 同名的永久表是不可見的 任何在臨時表上創建的索引也自動是臨時的

  LOCAL 關鍵字是可選的.

  table_name

  要創建的表名.這個表不能是已經存在的. 不過臨時表可以創建為和現有永久表同名. (譯注∶這裡指的是同名臨時表或永久表不能已經存在)

  column_name

  字段的名稱.多字段的名稱可以用逗號分隔的字段名列表聲明. 如果沒有提供字段名子那麼就從查詢的輸出字段名中獲取.

  query

  有效的查詢語句(也就是一條 SELECT 命令)請參考 SELECT 獲取可以使用的語法的描述.

  診斷

  請參考 CREATE TABLE和 SELECT 獲取可能的輸出的概要.

  注意

  這條命令從功能上等效於 SELECT INTO 但是我們更建議你用這個命令因為它不太可能和 SELECT INTO 語法的其它方面的使用混淆.

  兼容性 SQL

  這條命令是根據 Oracle 的一個特性 制作的.在 或 SQL 中沒有功能相等的命令.不過 把CREATE TABLE 和 INSERT SELECT 組合起來可以通過略微多一些的工作完成同樣的事情.

  歷史

  自 PostgreSQL 開始就已經有 CREATE TABLE AS 命令了.

  又見

  CREATE TABLE CREATE VIEW SELECT SELECT INTO


From:http://tw.wingwit.com/Article/program/Oracle/201311/16722.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.