?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
PL/pgSQL 是PostgreSQL 數(shù)據(jù)庫系統(tǒng)的一個可加載的過程語言。 PL/pgSQL 的設(shè)計目標(biāo)是創(chuàng)建一種可加載的過程語言,可以
用于創(chuàng)建函數(shù)和觸發(fā)器過程,
為SQL 語言增加控制結(jié)構(gòu),
執(zhí)行復(fù)雜的計算
繼承所有用戶定義類型、函數(shù)、操作符,
定義為被服務(wù)器信任的語言
容易使用
PL/pgSQL創(chuàng)建的函數(shù)可以在那些使用內(nèi)置函數(shù)一樣的情形下使用。 比如,可以創(chuàng)建復(fù)雜的條件計算函數(shù),并隨后將之用于定義操作符或者用于函數(shù)索引中。
在PostgreSQL9.0及其之后的版本中,PL/pgSQL是默認(rèn)安裝的。 當(dāng)然,PL/pgSQL仍然是一個可加載的模塊,因此,如果實(shí)際安全需要,管理員也可以選擇將它卸載掉。
SQL是 PostgreSQL和大多數(shù)其它關(guān)系型數(shù)據(jù)庫的命令語言。 它是可移植的,并且容易學(xué)習(xí)使用。 但是所有 SQL語句都必須由數(shù)據(jù)庫服務(wù)器獨(dú)立地執(zhí)行
這就意味著你的客戶端應(yīng)用必須把每條命令發(fā)送到數(shù)據(jù)庫服務(wù)器, 等待它處理這個命令,接收結(jié)果,對結(jié)果進(jìn)行一些處理, 然后再給服務(wù)器發(fā)送另外一條命令。 所有這些東西都會產(chǎn)生進(jìn)程間通訊, 并且如果你的客戶端在另外一臺機(jī)器上甚至還會產(chǎn)生網(wǎng)絡(luò)開銷。
通過PL/pgSQL, 可以把運(yùn)算塊和一系列命令在數(shù)據(jù)庫服務(wù)器內(nèi)部組成一個塊, 這樣就擁有了過程語言的能力并且簡化 SQL 的使用, 因而節(jié)約了大量的時間,因?yàn)椴恍枰M(jìn)行客戶端/服務(wù)器通訊。
消除了服務(wù)器和客戶端之間的往返通信。
客戶端不需要的中間結(jié)果無需在服務(wù)器端和客戶端來回傳遞。
不需要額外的語法分析步驟。
比起不使用存儲函數(shù)來,這樣做能夠產(chǎn)生明顯的性能提升。
同樣,在PL/pgSQL里,仍然可以使用 SQL 的所有數(shù)據(jù)類型,操作符和函數(shù)。
使用PL/pgSQL所寫的函數(shù)能夠接受服務(wù)器支持的任何標(biāo)量或數(shù)組數(shù)據(jù)類型作為參數(shù), 并且同樣能夠返回這些類型的結(jié)果, 它們還可以接受或者返回任意用名字聲明的復(fù)合類型(行類型)。 還可以將一個PL/pgSQL函數(shù)聲明為一個返回record類型(行類型), 表明該結(jié)果是一個行類型,這個行的字段是在調(diào)用它的查詢中指定的, 就像在Section 7.2.1.4里討論的那樣。
與聲明SQL函數(shù)一樣,通過使用VARIADIC可以對PL/pgSQL進(jìn)行聲明為能接受可變數(shù)目的參數(shù)。 正如在Section 35.4.5中討論的那樣。
PL/pgSQL 函數(shù)還可以聲明為接受并返回多態(tài)的anyelement, anyarray, anynonarray,和 anyenum 類型。 一個多態(tài)函數(shù)實(shí)際操作的數(shù)據(jù)類型可以在不同的調(diào)用環(huán)境中變化,如在Section 35.2.5里討論的那樣。 Section 39.3.1是一個使用例子。
PL/pgSQL還可以聲明為任何一個單個實(shí)例返回的數(shù)據(jù)類型"set(集)",或者表。 這樣的函數(shù)通過為結(jié)果集每個需要返回的元素執(zhí)行一個RETURN NEXT生成它的輸出, 或者通過使用RETURN QUERY來輸出評估查詢的結(jié)果。
最后,如果返回的結(jié)果沒有太大的價值,PL/pgSQL函數(shù)可以聲明為返回void。
PL/pgSQL函數(shù)也可以聲明為輸出某種類型的參數(shù),來代替明確的返回類型聲明。 這么做并未給該語言增加任何基礎(chǔ)設(shè)施,只是通常更方便些,特別是返回多行數(shù)值的時候。 同時,也可以用RETURNS TABLE來代替RETURNS SETOF。
具體的例子在Section 39.3.1和Section 39.6.1中。