Navicat 部落格

2019 年 4 月 9 日,由 Robert Gravelle 撰寫

大部分的關聯式資料庫(包括 MySQL、MariaDB 和 SQL Server)都支援預存程序和函式。實際上,預存程序和函式是非常相似的,可以用來完成相同的工作。話雖如此,在決定某項工作使用哪一種時,需要考慮兩者之間的一些重要差異。我們將在今天的文章中逐一介紹這些差異。

預存程序

預存程序(stored procedure,簡稱 proc)是一組有指定名稱的結構化查詢語言(Structured Query Language,SQL)語句,作為一個群組儲存在關聯式資料庫管理系統中,因此可以被多個程式重用和共用。預存程序可以存取或修改資料庫中的資料,但它不依賴於特定的資料庫或物件。這種不緊密結合的情況是有利的,因為為不同但相似的目的重用程序是非常容易。很易為不同但相似的目的而重用程序。

預存程序可以接受輸入參數並傳回多個輸出參數值。此外,預存程序可以設計語句以在資料庫中執行作業,並將狀態值傳回給呼叫程序或批次處理。

最後,預存程序可以執行多句 SQL 語句、呼叫函式,甚至反覆運算結果集、執行類似於程式碼設計的複雜作業。預存程序完成後,一般會將一個或多個結果集傳回給呼叫應用程式。

使用者函式

函式類似於預存程序,因為它包含一組執行特定工作的 SQL 語句。函式的概念是加強程式碼的重複使用性。如果你要重複編寫大型 SQL 指令碼來執行相同的工作,則可以建立一個執行該工作的函式,以便下次執行該工作時不必重寫 SQL,呼叫該函式就可以了。資料庫一般包含一組執行各種工作的內建函式,因此在編寫自己的函式之前,請務必先查看這些內建函式。

函式以參數的形式接受輸入並傳回值。與預存程序不同,函式不能傳回結果集。而且,函式無法修改伺服器環境或作業系統環境。

主要差異

雖然可以以類似的方式使用程序和函式,但是函式被設計為將其輸出傳送到查詢或 SQL 語句。同時,預存程序被設計為將輸出(即一個或多個結果集)傳回給應用程式。

另一個差異是,你可以分組一組 SQL 語句並在預存程序中執行它們,而預存程序不能在 SQL 語句中呼叫。但函式則可以直接在查詢和/或預存程序中呼叫。

最後,函式的一個限制是必須為每一列資料呼叫它們。因此,如果你在大型資料集使用函式,則可能會遇到效能問題。

在 Navicat 檢視預存程序和函式

在 Navicat 資料庫管理和開發工具中,你可以在「函式」下看見資料庫的程序和函式。預存程序具有「Px」圖示,而函式具有「fx」圖示:

總結

預存程序和函式在很多方面非常相似,但每種都有不同的用途。預存程序可以視為一組 SQL 語句,而函式則接受輸入參數並根據輸入的參數傳回輸出值。

Navicat 文章
頻道記錄
分享
部落格封存檔