延伸 MySQL 9.0  /  將函數加入 MySQL

第 6 章 將函數加入 MySQL

有三種方法可將新的函數加入 MySQL

  • 建立儲存函數(一種儲存物件)。儲存函數是使用 SQL 陳述式撰寫,而不是透過編譯物件程式碼。這裡不涵蓋撰寫儲存函數的語法。請參閱使用儲存常式

  • 建立原生(內建)MySQL 函數。原生函數是透過修改 MySQL 原始程式碼來新增,並編譯到 mysqld 伺服器中,使其成為永久可用的函數。請參閱第 6.1 節,「加入原生函數」

  • 使用可載入函數介面。可載入函數會編譯為程式庫檔案,然後使用 CREATE FUNCTIONDROP FUNCTION 陳述式從伺服器動態載入和卸載。請參閱第 6.2 節,「加入可載入函數」

    在某些情況下,可載入函數會包含在元件或外掛程式程式庫檔案中,並在安裝或解除安裝元件或外掛程式時自動載入和卸載。

注意

可載入函數之前稱為使用者定義函數 (UDF)。這個術語有點用詞不當,因為「使用者定義」也可能適用於使用 SQL 撰寫的儲存函數,以及透過修改伺服器原始程式碼新增的原生函數。

每個建立編譯函數的方法都有其優點和缺點

  • 加入原生函數需要修改來源發行版。加入可載入函數則不需要;它可以新增到二進位 MySQL 發行版,而無需存取 MySQL 來源碼。

  • 可載入函數包含在物件檔案中,您除了伺服器本身之外還必須安裝該物件檔案。對於編譯到伺服器中的函數,則不需要這樣做。(這一點不適用於由元件或外掛程式自動載入的可載入函數。)

  • 如果您升級 MySQL 發行版,則可以繼續使用先前安裝的可載入函數,除非您升級到較新的 MySQL 版本,而該版本的可載入函數介面有所變更。對於原生函數,您每次升級都必須重複進行原始程式碼修改。

無論使用哪種方法新增函數,都可以在 SQL 陳述式中像原生函數(例如 ABS()SOUNDEX())一樣呼叫。

如需說明伺服器如何解譯對不同種類函數的參照的規則,請參閱函數名稱剖析與解析

以下各節將說明可載入函數介面的功能、提供撰寫可載入函數的說明、討論 MySQL 為防止濫用可載入函數而採取的安全預防措施,以及說明如何新增原生 MySQL 函數。

如需說明如何撰寫可載入函數的範例原始程式碼,請查看 MySQL 來源發行版中提供的 sql/udf_example.cc 檔案。

注意

MySQL 原始程式碼包含使用 Doxygen 撰寫的內部文件。此文件對於從開發人員的角度了解 MySQL 的運作方式很有用。產生的 Doxygen 內容可在 https://mysqldev.dev.org.tw/doc/index-other.html 中取得。也可以使用 產生 MySQL Doxygen 文件內容 中的說明,從 MySQL 來源發行版在本機產生此內容。