參考:mysql
https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B9%9D%E7%AB%A0sql
摘記:數據庫
PL/pgSQL是 PostgreSQL 數據庫系統的一個可裝載的過程語言。數組
在PL/pgSQL中你能夠把一塊運算和一系列命令在數據庫服務器裏面組成一個塊,所以這樣就擁有了過程語言的力量而且簡化 SQL 的使用,而且能大量節約客戶端/服務器通信之間的開銷。服務器
客戶端和服務端之間額外的傳輸將被取消.
客戶端不須要也不用客戶端和服務端之間進行封裝或者傳輸的中間結果。
能夠避免命令的多輪解析
在PL/pgSQL中編寫的函數能夠用服務器支持的任何標量參數或者數組類型,而且他們能夠返回這些類型的任何結果。它們也能接受或者返回任何 聲明的複合類型(行類型)。聲明一個PL/pgSQL函數返回record函數,這意味這這個結果是一個行類型,這個行的字段是在調用它的查詢中指定的。函數
PL/pgSQL函數可以用VARIADIC標誌聲明一個可變的數字參數。這個方法實際和SQL的函數是用的方法是同樣的。post
PL/pgSQL函數也能夠聲明並接受返回多態的類型anyelement, anyarray, anynonarray, 和anyenum。一個多態的函數實際操做的數據類型能夠在不一樣的調用環境中變化。spa
PL/pgSQL函數也能聲明並返回單個實例的任意一個數據類型集(或者表)。這樣的函數經過爲結果集每一個須要返回的元素執行一個RETURN NEXT生成它的輸出,或者用RETURN QUERY的輸出來評估一個查詢的結果。postgresql
最後,PL/pgSQL 函數能夠聲明爲返回void,若是它沒什麼有用的值能夠返回的話。code
PL/pgSQL函數也可以用輸出的參數來進行聲明並代替一個明確的返回類型。這不會爲這個語言添加任何基本的功能,可是這樣經常是很方便的,特別是返回多個值的時候。這個RETURNS TABLE表示法也能用RETURNS SETOF進行替換。
我以爲雖然plpgsql是過程語言,可是pg中所編寫的過程基本上都屬於函數,由於關鍵字create function 和 returns 是固定的,而mysql中能夠分開create 存儲過程procedure 和函數function 兩類,function 都是要明確返回類型的,那再在從上述PL/pgSQL 函數能夠聲明爲返回void能夠看出plpgsql 同樣能夠「模仿」完成procedure的功能扮演,是異曲同工的,只是pg上更增強調這是一種語言:PL/pgSQL,而mysql只是單純的具有了可編寫存儲過程和函數這兩種功能。
yun=> \dL 語言列表 名稱 | 擁有者 | 信任 | 描述 ---------+----------+------+------------------------------ plpgsql | postgres | t | PL/pgSQL procedural language (1 行記錄)