Postgresql
“儲存過程”和“儲存函式”有什麼區別?
所以這個問題的評論提到,PostgreSQL中的“儲存過程”和“儲存函式”略有不同。
評論連結到維基百科文章,但其中一些似乎並不適用(例如,它們可以在
SELECT
聲明中使用)。語法本身似乎有點混亂:
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$ BEGIN [...] END; $emp_stamp$ LANGUAGE plpgsql; CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
您創建 a
FUNCTION
但將其稱為PROCEDURE
.那麼這兩者有什麼區別呢?
正式來說,PostgreSQL 只有“函式”。觸發函式有時被稱為“觸發過程”,但這種用法沒有明確的含義。在內部,函式有時被稱為過程,例如在系統目錄中
pg_proc
。這是 PostQUEL 的保留。某些人(可能在不同數據庫系統中具有經驗)可能與過程相關聯的任何特性,例如它們與防止 SQL 注入或使用輸出參數的相關性,也適用於 PostgreSQL 中存在的函式。現在,當 PostgreSQL 社區中的人們談論“儲存過程”或“真正的儲存過程”時,他們通常指的是類函式對象的假設特徵,可以在其主體中啟動和停止事務,這是目前函式無法做到的做。在此上下文中使用術語“儲存過程”似乎與其他數據庫產品類似。有關模糊的想法,請參閱此郵件列表執行緒。
然而,在實踐中,函式與過程在事務控制能力方面的這種區別並沒有被普遍接受,當然,許多沒有數據庫偏見的程序員會將過程類似於 Pascal 解釋為沒有返回值的函式。(SQL 標準似乎採取了中間立場,因為預設情況下過程與函式具有不同的事務行為,但這可以根據對象進行調整。)所以無論如何,尤其是在查看 Stack Exchange 上的問題時非常複雜的受眾,您應該避免過多假設並使用更清晰的術語或定義您期望的屬性。