?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
PostgreSQL數(shù)據(jù)類型可以分為基本類型、復合類型、域、偽類型。
基本類型是那些在SQL語言層次更低級別(通常是C語言)上實現(xiàn)的類型(比如int4類型), 它們通常與抽像數(shù)據(jù)類型對應。PostgreSQL對這些數(shù)據(jù)類型只能通過用戶提供的函數(shù)來操作, 并且對這些數(shù)據(jù)類型行為的理解只限于用戶所描述的范圍?;绢愋瓦M一步分成標量和數(shù)組類型。 對于每種標量類型,系統(tǒng)都會自動創(chuàng)建一個對應的數(shù)組類型,可以保存該標量類型的變長數(shù)組。
復合類型(或者說行類型)是用戶創(chuàng)建表時創(chuàng)建的。也可以用CREATE TYPE 創(chuàng)建一個"獨立的"、 沒有關(guān)聯(lián)表的復合類型。復合類型只是一個帶著相關(guān)字段名稱的基本類型的列表。 復合類型的數(shù)值是一行字段值或者一條字段值組成的記錄。用戶可以從SQL查詢里訪問其字段。 參考Section 8.15獲取更多復合類型的相關(guān)信息。
域基于一種特定的基本類型,從很多角度來看,它們也可以和其對應的基本類型交換。 但是,域可以有約束,把它的有效值限制在其對應的基本類型的有效值范圍的一個子集中。
域可以用SQL命令CREATE DOMAIN創(chuàng)建。它們的創(chuàng)建和使用不在本章討論。
系統(tǒng)里有集中用于特殊目的的"偽類型"。偽類型不能作為表的字段類型, 也不能作為復合類型的屬性,但是它們可以用于聲明函數(shù)的參數(shù)和結(jié)果類型。 這樣就在類型系統(tǒng)里提供了一個標識特殊類型函數(shù)的機制。Table 8-24列出了現(xiàn)有的偽類型。
anyelement,anyarray,anynonarray和anyenum是四種特別有趣的偽類型, 它們被稱作多態(tài)類型。任何用這些類型定義的函數(shù)就叫做多態(tài)函數(shù)。一種多態(tài)函數(shù)可以在許多不同的數(shù)據(jù)類型上操作, 它們根據(jù)調(diào)用中實際傳遞進來的數(shù)據(jù)類型判斷具體的類型。
多態(tài)參數(shù)和結(jié)果是相互綁定的,并且在分析查詢調(diào)用的函數(shù)時解析成特定的數(shù)據(jù)類型。 每個聲明成anyelement的位置(參數(shù)或者返回類型)都允許擁有一個特定的實際數(shù)據(jù)類型, 但是在任何給定的調(diào)用過程中,它們都必須是同樣的類型。 每個聲明為anyarray的位置都可以是任何數(shù)組數(shù)據(jù)類型,類似的, 它們也必許都是同樣的類型。如果有些位置聲明為anyarray而其它位置聲明為anyelement, 那么在anyarray位置上的類型必須是元素類型與那些出現(xiàn)在anyelement位置上的類型相同的數(shù)組。 anynonarray實際上被看做anyelement,但卻多一個約束:實際類型必須不能是一個數(shù)組類型。 anyenum實際上被看做anyelement,但卻多一個約束:實際類型必須是一個數(shù)組類型。
因此,如果多個參數(shù)位置聲明為多態(tài)類型,其實際效果是只允許某些實際參數(shù)類型的組合出現(xiàn)。 比如,一個函數(shù)聲明為equal(anyelement, anyelement)將接受任何兩個輸入值,只要它們的數(shù)據(jù)類型相同。
如果一個函數(shù)的返回值聲明為多態(tài)類型,那么至少有一個參數(shù)位置也是多態(tài)的, 并且提供給參數(shù)的類型決定本次調(diào)用實際返回的類型。比如,如果沒有數(shù)組下標機制, 那么我們可以定義一個實現(xiàn)下標的函數(shù)subscript(anyarray, integer) returns anyelement。 這個聲明約束第一個實際參數(shù)是一個數(shù)組類型,并且允許分析器從第一個參數(shù)的實際類型推導出正確的返回類型。 聲明為一個f(anyarray) returns anyenum的函數(shù)的另一個例子只接受枚舉類型的數(shù)組。
需要注意的是,anynonarray和anyenum不代表不同的類型變量; 它們是與anyelement相同的類型,只有一個額外的約束。 例如,聲明一個函數(shù)為f(anyelement, anyenum)等同于聲明它為f(anyenum, anyenum): 兩個實際參數(shù)必須是相同的枚舉類型。
一個可變參數(shù)函數(shù)(其使用一個可變數(shù)目的參數(shù),如Section 35.4.5中描述)可以 是多態(tài)的:可以通過聲明它的最后一個參數(shù)為VARIADIC anyarray來實現(xiàn)。 為了實現(xiàn)參數(shù)匹配并決定實際結(jié)果類型,這樣一個函數(shù)的行為等同于將anynonarray參數(shù)寫一個合適的數(shù)目。