Postgresql

“儲存過程”和“儲存函式”有什麼區別?

  • August 30, 2020

所以這個問題的評論提到,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();

您創建 aFUNCTION但將其稱為PROCEDURE.

那麼這兩者有什麼區別呢?

正式來說,PostgreSQL 只有“函式”。觸發函式有時被稱為“觸發過程”,但這種用法沒有明確的含義。在內部,函式有時被稱為過程,例如在系統目錄中pg_proc。這是 PostQUEL 的保留。某些人(可能在不同數據庫系統中具有經驗)可能與過程相關聯的任何特性,例如它們與防止 SQL 注入或使用輸出參數的相關性,也適用於 PostgreSQL 中存在的函式。

現在,當 PostgreSQL 社區中的人們談論“儲存過程”或“真正的儲存過程”時,他們通常指的是類函式對象的假設特徵,可以在其主體中啟動和停止事務,這是目前函式無法做到的做。在此上下文中使用術語“儲存過程”似乎與其他數據庫產品類似。有關模糊的想法,請參閱此郵件列表執行緒。

然而,在實踐中,函式與過程在事務控制能力方面的這種區別並沒有被普遍接受,當然,許多沒有數據庫偏見的程序員會將過程類似於 Pascal 解釋為沒有返回值的函式。(SQL 標準似乎採取了中間立場,因為預設情況下過程與函式具有不同的事務行為,但這可以根據對象進行調整。)所以無論如何,尤其是在查看 Stack Exchange 上的問題時非常複雜的受眾,您應該避免過多假設並使用更清晰的術語或定義您期望的屬性。

引用自:https://dba.stackexchange.com/questions/2357