| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 33. 擴展 SQL | Fast Forward | Next |
數據類型可以分為基本類型,復合類型,域和偽類型。
基本類型是那些在 SQL 語言層次更低的級別上 實現的類型,比如 int4(通常是一種低級的語言, 比如 C):它們通常與那些常被認為是抽象數據類型的類型對應; PostgreSQL 對這些數據類型只能通過用戶提供的方法來操作, 並且對這些數據類型的特性的理解只限于用戶所描述的範圍. 基本類型進一步分成標量和數組類型。對于每種標量類型, 系統都會自動創建一個對應的數組類型,可以保存該標量類型 變長的數組。
復合類型,或者說行類型,是當用戶創建表時創建的. 我們也可以創建一個"獨立的",沒有關聯表的 復合類型。一種復合類型只是一個帶著相關字段名稱的基本類型的列表。 一個復合類型的數值是一行字段值或者一條字段值組成的記錄。 用戶可以從 SQL 查詢裡訪問組成字段。
域是基于一種特定的基本類型的,從很多角度來看,它們也可以和對應 的基本類型交換。但是,一個域可以有約束,把它的有效值限制在它 的下層基本類型允許的有效值範圍的一個子集。
域可以用 SQL 命令 CREATE DOMAIN 創建。 它們的創建和使用不在本章討論。
系統裡有集中用于特殊目的的"偽類型"。偽類型不能出現在表 的字段類型中,也不能用做復合類型的屬性,但是它們可以用于聲明函數的參數和 結果類型。這樣就在類型系統裡提供了一個機制用于標識特殊類型的函數。 Table 8-20 列出了現有的偽類型。
兩種特別有趣的偽類型是 anyelement 和 anyarray, 它們在一起稱作多態類型。任何用這些類型定義 的函數就叫做多態函數。一種多態函數可以在許多不同 的數據類型上操作,它們判斷具體類型的方法是在一次調用中,使用實際傳遞進來的數據類型 來判斷。
多態參數和結果是相互綁定,並且在分析查詢調用的函數時解析成特定的數據類型。 每個聲明成 anyelement 的位置(參數或者返回類型)都允許擁有 一個特定的實際數據類型,但是在任何給定的調用過程中,它們都必須 是同樣的類型。每個聲明為 anyarray 的位置 都可以是任何數組數據類型,但是,類似的,它們也不許都是同樣的類型。如果有些 位置聲明為 anyarray 而其它的為自豪聲明為 anyelement, 那麼在 anyarray 位置上的類型必須是元素類型與那些出現在 anyelement 位置上的同類型的數組。
因此,如果多于一個參數位置聲明為一個多態類型,其實際效果是只允許某些實際 參數類型的組合出現。比如,一個函數聲明為 foo(anyelement, anyelement) 將接受任何兩個輸入值,只要它們的數據類型相同。
如果一個函數的的返回值聲明為多態類型,那麼至少有一個參數位置也是多態的, 並且提供給參數的類型決定該詞調用實際返回的類型。比如,如果沒有數組下標 機制,那麼我們可以定義一個函數實現下標的函數,像 subscript(anyarray, integer) returns anyelement。 這個聲明約束實際上的第一個參數是一個數組類型,並且允許分析器從第一個參數的 實際類型裡推導出正確的返回類型。