以 JavaScript 編寫的儲存函數或儲存程序,其建立、叫用和維護方式與以 SQL 編寫的程式大致相同,但須遵守此處列出的差異
必須在用於建立儲存程式的
CREATE FUNCTION
或CREATE PROCEDURE
陳述式中,使用LANGUAGE JAVASCRIPT
明確宣告儲存程式語言;否則,MySQL 會假設預期語言為 SQL。常式主體的語法會在建立時檢查;任何錯誤都會導致
CREATE
陳述式被拒絕,且不會建立儲存程式。程式主體必須使用
AS
關鍵字加上以錢字符號引用的分隔符號 (例如$$
、$js$
、$mysql$
等) 來標示。您必須使用相同的分隔符號來標示常式主體的開頭和結尾。可以使用引號來分隔常式主體,但建議使用以錢字符號引用的分隔符號,因為這樣可避免在函數或程序代碼中引用字串的問題。在第一個以錢字符號引用的分隔符號之後,mysql 用戶端提示字元會變更為$>
,以表示常式主體內的每個新行,直到遇到結尾的以錢字符號引用的分隔符號為止,之後提示字元會恢復為預設值 (通常為->
)。這可以在先前用於建立add_nos()
函數的CREATE FUNCTION
陳述式中看到。對於 SQL 儲存常式,不需要指定陳述式分隔符號或終止符號。如果您使用選用的
;
字元來分隔 JavaScript 陳述式,則會將其正確解譯為 JavaScript 常式的一部分,而不是 SQL 陳述式分隔符號,如下所示mysql> CREATE FUNCTION js_pow(arg1 INT, arg2 INT) -> RETURNS INT LANGUAGE JAVASCRIPT -> AS -> $$ $> let x = Math.pow(arg1, arg2); $> return x; $> $$ -> ; Query OK, 0 rows affected (0.02 sec) mysql> SELECT js_pow(2,3); +-------------+ | js_pow(2,3) | +-------------+ | 8 | +-------------+ 1 row in set (0.00 sec)
為了盡量減少可能的混淆,我們在本節剩餘的範例中,不會對任何 JavaScript 陳述式使用
;
分隔符號。常式主體的文字一律會被視為
utfmb4
,無論實際使用的字元集為何。這表示無論用戶端用於常式主體的字元集為何,伺服器都會先將其轉換為utf8mb4
,然後再將其儲存在資料字典中。由於 utf8mb4 包含所有其他支援的字元集,因此這應該不會是問題。與 SQL 儲存程式一樣,JavaScript 程式引數和常式名稱必須使用
utfmb3
字元集。請參閱 第 12.9 節,「Unicode 支援」。字串引數和傳回類型預期為
utf8mb4
;這表示如果 JavaScript 儲存程式所屬的結構描述的預設字元集為其他字元集,則其所有引數都必須明確宣告為utf8mb4
。輸入引數名稱必須符合 JavaScript 識別碼的規則:它們可以包含 Unicode 字母、
$
、_
和數字 (0-9),但不得以數字開頭。使用 JavaScript 中保留的單字 (例如
var
或function
) 作為引數名稱會產生錯誤。由於 MySQL JavaScript 儲存程式一律使用嚴格模式,因此也包括package
和let
等關鍵字。如需完整清單,請參閱 保留字。此外,MLE 元件也保留了mysql
、console
和graal
關鍵字,且不能在 MySQL JavaScript 儲存程式中用作變數或引數名稱。您可以使用
ALTER FUNCTION
和ALTER PROCEDURE
修改 JavaScript 儲存程式,就像您修改 SQL 儲存函數或程序一樣。不支援使用ALTER
變更語言;在這種情況下,您必須使用DROP FUNCTION
或DROP PROCEDURE
(視情況而定),然後使用適當的CREATE
陳述式重新建立儲存程式。
若要取得伺服器上所有資料庫中所有 JavaScript 儲存程式的清單,請查詢 Information Schema ROUTINES
表格,如下所示
mysql> SELECT CONCAT(ROUTINE_SCHEMA, '.', ROUTINE_NAME) AS "JS Stored Routines"
-> FROM INFORMATION_SCHEMA.ROUTINES
-> WHERE EXTERNAL_LANGUAGE="JAVASCRIPT";
+------------------------+
| JS Stored Routines |
+------------------------+
| test.pc1 |
| test.pc2 |
| world.jssp_simple1 |
| test.jssp_vsimple |
| test.jssp_simple |
| world.jssp_vsimple |
| world.jssp_vsimple2 |
| world.jssp_simple_meta |
+------------------------+
8 rows in set (0.00 sec)