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

超詳細sql大全(2)

2022-06-13   來源: Oracle 

  

  CLUSTER

  Name

  CLUSTER    根據一個索引對某個表集簇

  Synopsis

  CLUSTER indexname ON table name

  輸入

  indexname

  一個索引名稱.

  table

  准備建簇的表的名稱.

  輸出

  CLUSTER

  成功建簇.

  ERROR: relation <tablerelation_number> inherits table

  ERROR: Relation table does not exist!

  描述

  CLUSTER指示PostgreSQL 近似地基於索引 indexname 的度量對表 table 進行存儲建簇. 索引必須已經在表 table name 上定義了.

  當對一個表建簇後該表的物理存儲將基於索引信息進行. 建簇是靜態的也就是說當表被更新後改變的內容不會建簇. 不會試圖對更新過的記錄重新建簇.如果需要可以通過手工執行該命令的方法重建簇.

  注意

  該表實際上按索引順序拷貝到了一個臨時表中然後重新改成原名. 因此在建簇時所有賦予的權限和其它索引都將丟失.

  如果你只是隨機的訪問表中的行 那麼在堆表中的數據的實際存儲順序是無關緊要的. 但是如果你對某些數據的訪問多於其他數據而且有一個索引將這些數據分組那你就將從 使用 CLUSTER 中獲益.

  另一個CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時 如果你從一個表中請求一定索引范圍的值或者是一個索引過的值對應多行 CLUSTER 也會有助於應用因為如果索引標識出第一匹配行所在的堆存儲頁所有 其他行也可能已經在同一堆存儲頁裡了 這樣便節省了磁盤訪問的時間加速了查詢.

  有兩種建簇的數據.第一種是用 CLUSTER 命令此命令將原表按你聲明的索引重新排列. 這個動作在操作大表時可能會很慢 因為每一行都從堆存儲頁裡按索引順序取出如果存儲頁表沒有排序整個表是隨機存放在各個頁面的因而每行都要進行依次磁盤頁面操作. PostgreSQL 有一個緩沖 但一個大表的主體是不可能都放到緩沖去的.

  另一個對數據建簇的方法是使用

  SELECT column list INTO TABLE new table

  FROM table ORDER BY column list

  這個用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引在對未排序的數據操作時速度快得多. 然後你可以刪除舊表用 ALTER TABLERENAME將 new table 改成舊表名 並且重建該表所有索引.唯一的問題是 OID 將不保留.這時再做 CLUSTER 將快得多 因為大多數堆棧數據已經排過序了而且使用現有的索引.

  用法

  以雇員的薪水屬性對雇員關系建簇.

  CLUSTER emp_ind ON emp;

  兼容性 SQL

  在 規范裡沒有 CLUSTER 語句.

  

  COMMENT

  COMMENT

  Name

  COMMENT    定義或者改變一個對象的評注

  Synopsis

  COMMENT ON

  [

  [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name |

  COLUMN lumn_name|

  AGGREGATE agg_name agg_type|

  FUNCTION func_name (arg arg )|

  OPERATOR op (leftoperand_type rightoperand_type) |

  TRIGGER trigger_name ON table_name

  ] IS text

  輸入

  object_name table_name column_name agg_name func_name op trigger_name

  要加入評注的對象名稱.

  text

  要加入的評注.

  輸出

  COMMENT     成功對表評注後的返回.

  描述

  COMMENT存儲一個數據庫對象的評注 這個評注可以很容易用 psql的 \dd或 \d+ 或者 \l+ 命令檢索出來.其它檢索評注的用戶接口可以建設在 psql 所用地同樣地內部函數的基礎上也就是 obj_description() 和 col_description().

  要修改一個評注為同一個對象發出一條新的 COMMENT 命令即可.每個對象只存儲一條評注. 要刪除評注在文本字串的位置寫上 NULL.當刪除對象時評注自動被刪除掉.

  需要說明的是目前評注沒有安全機制∶任何聯接到某數據庫上地用戶 都可以看到所有該數據庫對象地評注(盡管只有超級用戶可以修改 不屬於它地對象的評注).因此不要在評注裡放安全性敏感地信息.

  用法

  給表mytable 加評注

  COMMENT ON mytable IS This is my table;

  一些例子

  COMMENT ON DATABASE my_database IS Development Database;

  COMMENT ON INDEX my_index IS Enforces uniqueness on employee id;

  COMMENT ON RULE my_rule IS Logs UPDATES of employee records;

  COMMENT ON SEQUENCE my_sequence IS Used to generate primary keys;

  COMMENT ON TABLE my_table IS Employee Information;

  COMMENT ON TYPE my_type IS Complex Number support;

  COMMENT ON VIEW my_view IS View of departmental costs;

  COMMENT ON COLUMN my_tablemy_field IS Employee ID number;

  COMMENT ON AGGREGATE my_aggregate (double precision) IS Computes sample variance;

  COMMENT ON FUNCTION my_function (timestamp) IS Returns Roman Numeral;

  COMMENT ON OPERATOR ^ (text text) IS Performs intersection of two text;

  COMMENT ON TRIGGER my_trigger ON my_table IS Used for RI;

  兼容性 SQL

  裡沒有COMMENT.

  

  COMMIT

  COMMIT

  Name

  COMMIT    提交當前事務

  Synopsis

  COMMIT [ WORK | TRANSACTION ]

  輸入

  WORK

  TRANSACTION

  可選關鍵字沒有作用

  輸出

  COMMIT

  提交成功返回此信息.

  NOTICE: COMMIT: no transaction in progress

  如果過程中沒有事務返回此信息.

  描述

  COMMIT提交當前事務. 所有事務的更改都將為其他事務可見而且保證當崩潰發生時的可持續性.

  注意

  關鍵字 WORK 和 TRANSACTION 都可以忽略.

  使用 ROLLBACK語句退出一次事務.

  用途

  要讓所有變更永久化

  COMMIT WORK;

  兼容性 SQL

  只聲明了兩種形式 COMMIT 和 COMMIT WORK否則完全兼容

  

  COPY

  COPY

  Name

  COPY    在表和文件之間拷貝數據

  Synopsis

  COPY [ BINARY ] table [ WITH OIDS ]    FROM { filename | stdin }    [ [USING] DELIMITERS delimiter ]    [ WITH NULL AS null string ]COPY [ BINARY ] table [ WITH OIDS ]    TO { filename | stdout }    [ [USING] DELIMITERS delimiter ]    [ WITH NULL AS null string ] 輸入

  BINARY

  改變字段格式行為強制所有數據都使用二進制格式存儲和讀取 而不是以文本的方式. DELIMITERS 和 WITH NULL 選項和二進制格式無關.

  table

  現存表的名字.

  WITH OIDS

  拷貝每行的內部唯一對象標識(OID).

  filename

  輸入或輸出的 Unix 文件的絕對文件名.

  stdin

  聲明輸入是來自客戶端應用.

  stdout

  聲明輸入前往客戶端應用.

  delimiter

  用於在文件中每行中分隔各個字段的字符.

  null string

  個代表 NULL 值的字串缺省是 \N (反斜槓N) 當然你可以自己挑一個空字串

  注意: 對於拷貝入(copy in)任何匹配這個字串的字串將被存儲為 NULL 值 所以你應該確保你用 的字串和拷貝出(copy out)相同

  輸出

  COPY

  拷貝成功完成.

  ERROR: reason

  拷貝失敗原因在錯誤信息裡.

  描述

  COPY在 PostgreSQL表和標准文件系統文件之間交換數據. COPY TO 把一個表的所有內容都拷貝到一個文件 而 COPY FROM 從一個文件裡拷貝數據到一個表裡 (把數據附加到表中已經存在的內容裡).

  COPY指示 PostgreSQL 後端直接從文件中讀寫數據.如果聲明了文件名那麼該文件必須為後 端可見而且文件名必須從後端的角度聲明.如果聲明的是 stdin 或 stdout 數據通過客戶前端流到後端.

  小提示: 不要把 COPY 和 psql 指令 \copy 混淆在一起. \copy 調用 COPY FROM stdin 或 COPY TO stdout然後抓取/存儲 psql 客戶端可以訪問的一個文件裡. 因此使用 \copy 的時候 可訪問性和訪問權限取決於客戶端而不是服務器端.

  注意

  BINARY 關鍵字將強制使用二進制對象而不是文本存儲/讀取所有數據. 這樣做在一定程度上比傳統的拷貝命令快但二進制拷貝文件在不同機器體系間的植性不是很好.

  缺省地文本拷貝使用 tab (\t)字符作為分隔符. 分隔符仍然可以用關鍵字 USING DELIMITERS 改成任何其它的字符. 在數據中碰巧與分隔符相同的字符將用反斜扛引起.

  你對任何要COPY 出來的數據必須有select 權限對任何要 COPY 入數據的表必須有 insert 或 update 權限. 使用 COPY 時後端同樣需要適當的對文件操作的 Unix 權限.

  COPY TO不會激活規則也不會處理字段缺省值不過它的確激活觸發器和檢查約束

  COPY在第一個錯誤處停下來.這些在 COPY FROM中不應該導致問題但在 COPY TO 時目的表會已經接收到早先的行 這些行將不可見或不可訪問但是仍然會占據磁盤空間. 如果你碰巧是拷貝很大一塊數據文件的話積累起來這些東西可能會占據相當大的一部分磁盤空間. 你可以調用 VACUUM來恢復那些磁盤空間.

  COPY命令裡面的文件必須是可以由後端直接讀或寫的文件而不是由客戶端應用讀寫. 因此它們必須位於數據庫服務器上或者可以為數據庫服務器所訪問 而不是由客戶端做這些事情. 它們必須是PostgreSQL用戶(服務器運行的用戶 ID) 可以訪問到並且 可讀或者可寫而不是客戶端. COPY 到一個命名文件是只允許數據庫超級用戶進行的 因為它允許寫任意後端有權限寫的文件.

  小技巧: psql指令 \copy 以客戶的權限讀或寫在客戶端的文件因此不局限於超級用戶.

  我們建議在 COPY 裡的文件名字總是使用 絕對路徑.在 COPY TO 的時候是由後端強制 進行的但是對於 COPY FROM你的確有從一個聲明為相對路徑的文件裡讀取的選擇.該路徑將解釋為相對於後端的 工作目錄(在 $PGDATA 裡的什麼地方) 而不是客戶端的工作目錄.

  文件格式

  文本格式

  當不帶 BINARY 選項使用 COPY TO 時 生成的文件每條元組占據一行每列(字段)用分隔符分開.內嵌的分隔符字 符將由一個反斜槓(\)開頭. 字段值本身是由與每個字段類型相關的輸出函數生成的字符串.某一類型的輸出函數本身不應該生成反斜槓這個任務由 COPY 本身完成.

  每個元組的實際格式是

  <attr><separator><attr><separator><separator><attrn><newline>    請注意每行的結尾是用 Unix 風格的換行符(\n)標記的. 如果給出的文件包含 DOS 或 Mac 風格的換行符那麼 COPY FROM 將會出錯.

  如果聲明了 WITH OIDST它將被放在每行的開頭.

  如果 COPY TO 將它的輸出輸出到標准輸出而不是一個文件 在拷貝結束時它將在一個新行上輸出一個反斜槓(\)和一 個句點(最後是一個換行符做為文件結束符.類似如果 COPY FROM 從標准輸入讀入數據它將把一行開頭的由一個 反斜槓(\)和一個句點()和一個換行符組成的這三個連續字符作為文件結束符. 不過如果在這個特殊的文件結束模式出現 前關閉了輸入聯接那麼COPY FROM 將正確結束(接著就是後端自身).

  反斜槓有其他的含義.一個文本反斜槓字符輸出成兩個連續的反斜槓 (\\) 一個文本tab字符用一個反斜 槓後面跟一個tab代表. (如果你使用了非 tab 作為列分隔符那麼在數據中出現的該字符將會使用反斜扛轉意.) 一個文本新行字符用一個反斜槓和一個新行代表. 當裝載不是由 PostgreSQL 生成的文件時你需要將反 斜槓字符 (\)轉換成雙反斜槓(\\)以保證正確裝載.

  二進制格式

  在PostgreSQLv 中的 COPY BINARY 的文件格式做了變化.新格式由一個文件頭零或多條元組 以及文件尾組成.

  文件頭

  文件頭由 個字節的固定域組成後面跟著一個變長的頭擴展區.固定域是

  簽名

  字節的序列 PGBCOPY\n\\r\n\ 請注意空是簽名是要求的一部分.(使用這個簽名是為了讓我們能夠很容易看出文件是否已經被一個非 位安全的轉換器給糟蹋了.這個簽名會被換行符轉換過濾器刪除空刪除高位或者奇偶的改變而改變.)

  整數布局域

  以源機器的字節序的 int 常量 x.如果在這裡偵測到錯誤的字節序那麼讀者很可能在後面的字段列造成了字節錯位.

  標志域

  int 位掩碼表示該文件格式的重要方面.位是從 (LSB)到 (MSB)編碼的 請注意這個域是以源機器的位權重存儲的後繼的整數都是如此.位 是保留用做關鍵文件格式的如果讀者發現一個不認識的位出現在這個范圍內那麼它應該退出.位 都保留為標志向後兼容的格式使用讀者可以忽略這個范圍內的不認識的位.目前只定義了一個標志位而其它的必須是零

  Bit

  如果為 那麼在傾倒中包括了 OID如果為 則沒有

  頭擴展范圍長度

  int 以字節計的頭剩余長度不包括自身.在初始的版本裡它將會是零後面緊跟第一條元組.對該格式的更多的修改都將允許額外的數據出現在頭中.讀者應該忽略任何它不知道該如何處理的頭擴展數據.

  頭擴展數據是一個用來保留一個自定義的數據訓練用的.這個標志域無意告訴讀者擴展區的內容是什麼.頭擴展的具體設計內容留給以後的版本用.

  這樣設計就允許向下兼容頭附加(增加頭擴展塊或者設置低位序標志位) 以及非向下兼容修改(設置高位標志位以標識這樣的修改並且根據需要向擴展區域增加支持數據).

  元組

  每條元組都以一個 int 計數開頭該計數是元組中字段的數目.(目前在一個表裡的每條元組都有相同的計數但可能不會永遠這樣.)然後後面不斷出現元組中的各個字段在字段數據後面可能跟著一個 int 類型長度字.類型長度域是這樣解釋的

  零

  數據域是 NULL.沒有數據跟著.

  >

  數據域是定長數據類型.和類型長字相同的准確的 N 字節.

  

  數據域是變長的數據類型.下面四個字節是變長頭 它包含包括其自身在內的所有值長度.

  <

  保留為將來使用.

  對於非 NULL 域讀者可以檢查這個類型長度是否匹配目標列的長度.這樣就提供了一種簡單但有用的檢查核實該數據是否預期數據.

  在數據域之間沒有對奇填充或者任何其它額外的數據.還要注意該格式並不區分一種數據類型是傳值還是傳參.這些東西都是非常有意的它們可能可以提高這些文件的移植性(盡管位權重和浮點格式等問題可能仍然不能讓你進行跨機器移動二進制數據).

  如果在傾倒中包括了 OID那麼該 OID 域立即跟在域計數字後面.它是一個普通的域只不過它沒有包括在域計數.但它包括類型長度 這樣就允許我們不用花太多的勁就可以處理 字節和 字節並且如果某個家伙允許 OID 是可選的話那麼還可以把 OID 顯示成 NULL.

  文件尾

  文件尾包括一個 int 字減 .這樣就很容易與一條元組的域計數字 相區分.

  如果一個域計數字既不是 也不是預期的字段的數目那麼讀者應該報錯.這樣就提供了對丟失與數據的同步的額外的檢查.

  用法

  下面的例子把一個表拷貝到標准輸出 使用豎直條(|)作為域分隔符

  COPY country TO stdout USING DELIMITERS |; 從一個 Unix 文件中拷貝數據到一個表范圍中

  COPY country FROM /usr/proj/bray/sql/country_data; 下面是一個可以從 stdin 中拷貝數據 到表中的例子(因此它在最後一行中有終止序列)

  AF      AFGHANISTANAL      ALBANIADZ      ALGERIAZM      ZAMBIAZW      ZIMBABWE\ 請注意在這裡每行裡的空白實際上是一個 TAB.

  下面的是同樣的數據在一台 Linux/i 機器上以二進制形式輸出.這些數據是用 Unix 工具 od c 過濾之後輸出的. 該表有三個域第一個是 char()第二個是 text 第三個是integer.所有的行在第三個域都是一個 null 值.

     P   G   B   C   O   P   Y \n \r \n \ \ \ \ \ \ \ \ \ \ \ \ \   A   F \ \ \   A   F   G   H   A   N   I   S   T   A   N \ \ \ \ \ \   A   L \v \ \ \   A   L   B   A   N   I   A \ \ \ \ \ \   D   Z \v \ \ \   A   L   G   E   R   I   A \ \ \ \ \ \   Z   M \n \ \ \   Z   A   M   B   I   A \ \ \ \ \ \   Z   W \f \ \ \   Z   I   M   B   A   B   W   E \ \ 兼容性 SQL   在 裡沒有 COPY 語句.

  

  CREATE AGGREGATE

  CREATE AGGREGATE

  Name

  CREATE AGGREGATE    定義一個新的聚集函數

  Synopsis

  CREATE AGGREGATE name ( BASETYPE = input_data_type

  SFUNC = sfunc STYPE = state_type

  [ FINALFUNC = ffunc ]

  [ INITCOND = initial_condition ] )

  輸入

  name

  要創建的聚集函數名.

  input_data_type

  本聚集函數要處理的基本數據類型. 對於不檢查輸入類型的聚集來說這個參數可以聲明為 ANY. (比如 count(*)).

  sfunc

  用於處理源數據列裡的每一個輸入數據的狀態轉換函數名稱. 它通常是一個兩個參數的函數第一個參數的類型是 state_type 而第二個參數的類型是 input_data_type 另外對於一個不檢查輸入數據的聚集該函數只接受一個類型為 state_type 的參數. 不管是哪種情況此函數必須返回一個類型為 state_type的值. 這個函數接受當前狀態值和當前輸入數據條目而返回下個狀態值.

  state_type

  聚集的狀態值的數據類型.

  ffunc

  在轉換完所有輸入域/字段後調用的最終處理函數.它計算聚集的結果. 此函數必須接受一個類型為 state_type 的參數. 聚集的輸出數據類型被定義為此函數的返回類型.如果沒有聲明 ffunc 則使用聚集結果的狀態值作為聚集的結果而輸出類型為 state_type.

  initial_condition

  狀態值的初始設置(值).它必須是一個數據類型 state_type 可以接受的文本常量值. 如果沒有聲明狀態值初始為 NULL.

  輸出

  CREATE

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

  描述

  CREATE AGGREGATE允許用戶或程序員通過定義新的聚集函數來擴展 PostgreSQL 的功能.一些用於基本類型的聚集函數如 min(integer) 和 avg(double precision) 等已經包含在基礎軟件包裡了. 如果你需要定義一個新類型或需要一個還沒有提供的聚集函數這時便可用 CREATE AGGREGATE 來提供我們所需要的特性.

  一個聚集函數是用它的名字和輸入數據類型來標識的. 如果兩個聚集的輸入數據不同它們可以有相同的名字.要避免沖突 不要寫一個與聚集同名而且輸入函數也相同的普通函數.

  一個聚集函數是用一個或兩個普通函數做成的 一個狀態轉換函數 sfunc 和一個可選的終計算函數 ffunc 它們是這樣使用的

  sfunc( internalstate nextdataitem ) > nextinternalstate

  ffunc( internalstate ) > aggregatevalue

  PostgreSQL 創建一個類型為 stype的臨時變量. 它保存這個聚集的當前內部狀態. 對於每個輸入數據條目 都調用狀態轉換函數計算內部狀態值的新數值.在處理完所有數據後調用一次最終處理函數以計算聚集的輸出值. 如果沒有最終處理函數那麼將最後的狀態值當做返回值.

  一個聚集函數還可能提供一個初始條件也就是說 所用的該內部狀態值的初始值.這個值是作為類型 text 的數據域存儲在數據庫裡的 不過它們必須是狀態值數據類型的合法的外部表現形式的常量. 如果沒有提供狀態那麼狀態值初始化為 NULL.

  如果在 pg_proc 裡該狀態轉換函數被定義為 strict 那麼 NULL 輸入就不能調用它.這個時候帶有這樣的轉換函數的聚集執行起來的現象如下所述.NULL 輸入的值被忽略(不調用此函數並且保留前一個 狀態值).如果初始狀態值是 NULL那麼由第一個非 NULL 值替換該狀態值 而狀態轉換函數從第二個非 NULL 的輸入值開始調用.這樣做讓我們比較容易 實現象 max 這樣的聚集.請注意這種行為只是當 state_type 與 input_data_type 相同的時候才表現出來. 如果這些類型不同你必須提供一個非 NULL 的初始條件或者使用一個 非strice的狀態轉換函數.

  如果狀態轉換函數不是 strict(嚴格)的 那麼它將無條件地為每個輸入值調用並且必須自行處理 NULL 輸入和 NULL 轉換值 這樣就允許聚集的作者對聚集中的 NULL 有完全的控制.

  如果終轉換函數定義為strict則如果最終狀態值是 NULL 時就不能調用它 而是自動輸出一個NULL的結果.(當然這才是 strict 函數的正常特征.) 不管是那種情況終處理函數可以選擇返回 NULL.比如 avg 的終處理函數在零輸入記錄時就會返回 NULL.

  注意

  使用 DROP AGGREGATE 刪除聚集函數.

  CREATE AGGREGATE的參數可以以任何順序書寫而不只是上面顯示的順序.

  用法

  請參考 PostgreSQL 程序員手冊 聚集函數章節的聚集函數部分獲取完整的例子.

  兼容性 SQL

  CREATE AGGREGATE是 PostgreSQL 語言的擴展. 在 裡沒有 CREATE AGGREGATE.

  

  CREATE CONSTRAINT TRIGGER

  CREATE CONSTRAINT TRIGGER

  Name

  CREATE CONSTRAINT TRIGGER    定義一個新的約束觸發器

  Synopsis

  CREATE CONSTRAINT TRIGGER name

  AFTER events ON

  relation constraint attributes

  FOR EACH ROW EXECUTE PROCEDURE func ( args )

  輸入

  name

  約束觸發器的名稱.

  events

  觸發該觸發器的事件范圍.

  relation

  被觸發的關系名稱.

  constraint

  實際的約束聲明.

  attributes

  約束屬性.

  func(args)

  觸發器處理所調用的函數.

  輸出

  CREATE CONSTRAINT

  成功創建後的返回信息.

  描述

  CREATE CONSTRAINT TRIGGER被 CREATE/ALTER TABLE 內部使用以及被 pg_dump 用於創建那些用於參考完整性的特殊的觸發器.

  這條語句不是做一般用途用的.

  

  CREATE DATABASE

  CREATE DATABASE

  Name

  CREATE DATABASE    創建新數據庫

  Synopsis

  CREATE DATABASE name

  [ WITH [ LOCATION = dbpath ]

  [ TEMPLATE = template ]

  [ ENCODING = encoding ] ]

  輸入

  name

  要創建的數據庫名.

  dbpath

  在文件系統裡存儲新數據庫的可選位置用字串文本聲明. 或者用 DEFAULT 表示使用缺省位置.

  template

  從哪個模板創建新數據庫這是模板名.或者用 DEFAULT 使用缺省模板(template).

  encoding

  創建新數據庫用的多字節編碼方法.聲明一個字串文本名字 (比如SQL_ASCII或者一個整數編號或者是 DEFAULT 表示使用缺省編碼.

  輸出

  CREATE DATABASE

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

  ERROR: user username is not allowed to create/drop databases

  你必須有特殊的 CREATEDB 權限來創建數據庫參閱 See CREATE USER

  ERROR: createdb: database name already exists

  如果聲明的數據庫 name 已經存在返回的信息.

  ERROR: database path may not contain single quotes

  數據庫路徑名 dbpath 不能包含單引號這樣要求是為了創建數據庫目錄的 shell 命令能夠正確執行

  ERROR: CREATE DATABASE: may not be called in a transaction block

  如果你有一個明確的事務塊正在處理你不能調用 CREATE DATABASE你必須先結束事務

  ERROR: Unable to create database directory path

  ERROR: Could not initialize database directory

  這種情況最有可能是因為對數據目錄權限不夠 磁盤已滿或其他文件系統問題數據庫服務器運行的機器上的用戶必 須能訪問該路徑

  描述

  CREATE DATABASE創建一個新的 PostgreSQL 數據庫.創建者成為新數據庫的管理員.

  可以聲明一個可選的數據庫位置例如在另一塊硬盤上存放數據庫 該路徑必須是事先用 initlocation命令准備好了的.

  如果路徑名不包含斜槓那麼它被解釋成一個環境變量 該變量必須為服務進程所知這樣數據庫管理員 可以對能夠在那裡創建數據庫進行控制(例如一個用戶化的選擇是 PGDATA)如果服務器帶著 ALLOW_ABSOLUTE_DBPATHS (缺省時沒有)選項編譯那麼也允許使用以斜槓開頭為標識的絕對路徑(例如 /usr/local/pgsql/data

  缺省時新數據庫將通過克隆標准系統數據庫 template 來創建.不同的模板可以用 TEMPLATE = name 來寫.尤其是如果你用 TEMPLATE = template 你可以創建一個很純淨的數據庫只包括你的版本的 PostgreSQL 預定義的標准對象.這個方法可以避免把任何已經加入到template 裡的本地安裝對象拷貝到新數據庫.

  可選的編碼參數允許選擇數據庫編碼 如果你的服務器是帶著多字節編碼支持編譯的話. 如果沒有聲明缺省是所選用的模板數據庫用的編碼.

  可選參數可以以任意順序寫而不僅是上面顯示的順序.

  注意

  CREATE DATABASE是 PostgreSQL 語言的擴展.

  使用 DROP DATABASE刪除一個數據庫.

  程序 createdb是 是這個命令的 shell 腳本的封裝提供來方便使用

  在用絕對路徑指定的可選數據庫位置時 有一些安全和數據完整性的問題 而且缺省時只有後端識別的環境變量可以聲明為可選的路徑.參考管理員手冊獲取更多的信息.

  盡管我們可以通過把某數據庫名聲明為模板從非template數據庫拷貝數據庫但是這(還)不是一個通用的 COPY DATABASE 功能. 因此我們建議當做模板使用的數據庫都應該是以只讀方式對待的.參閱管理員手冊獲取更多信息.

  用法

  創建一個新的數據庫

  olly=> create database lusiadas;

  在另一個地方 ~/private_db創建新數據庫

  $ mkdir private_db

  $ initlocation ~/private_db

  The location will be initialized with username olly

  This user will own all the files and must also own the server process

  Creating directory /home/olly/private_db

  Creating directory /home/olly/private_db/base

  initlocation is complete

  $ psql olly

  Welcome to psql the PostgreSQL interactive terminal

  Type: \copyright for distribution terms

  \h for help with SQL commands

  \? for help on internal slash commands

  \g or terminate with semicolon to execute query

  \q to quit

  olly=> CREATE DATABASE elsewhere WITH LOCATION = /home/olly/private_db;

  CREATE DATABASE

  兼容性 SQL

  在 裡沒有 CREATE DATABASE 語句. 數據庫等同於目錄其創建是由實現決定的.

  

  CREATE FUNCTION

  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程序員手冊


From:http://tw.wingwit.com/Article/program/Oracle/201311/18929.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.