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