MySQL JavaScript 儲存程式受到本節所述的限制與約束。
支援 Global
物件和 globalThis
物件屬性,但其範圍僅限於目前常式。例如,如果給定的 JavaScript 程式在 JavaScript 程式內設定 globalThis.myProp = 10
,則其他 JavaScript 程式無法使用,即使在同一個工作階段中也是如此,而且在後續呼叫同一個 JavaScript 程式時存取 globalThis.myProp
也不會產生相同的值。
在一個儲存程式中定義的 JavaScript 變數 (區域或全域) 無法從執行相同程式的任何其他連線存取。
不支援從 JavaScript 儲存程式碼存取檔案或網路。MySQL 中的 JavaScript 儲存程式不允許使用第三方模組;因此,不支援 import
陳述式。此外,也不支援 Node.js。
MLE 元件使用單執行緒執行模型。這表示所有非同步功能 (如 JavaScript Promise
物件和 async
函數) 都是模擬的,而且可能會出現非決定性行為。
如同 SQL 儲存常式,不支援具有可變引數數目的 JavaScript 儲存常式;每個引數及其類型必須在建立時指定。常式中的 JavaScript 函數可以具有可變引數數目。
可以從 JavaScript 儲存程式的主體內呼叫其他儲存程式,並且可以從 SQL 儲存程式 (包括儲存程序、儲存函數、事件和觸發器) 內叫用 JavaScript 儲存程式,如其他地方所示 (請參閱第 27.3.9 節,「JavaScript 儲存程式範例」)。JavaScript 儲存程式也可以遞迴呼叫本身;可以在 JavaScript 儲存程式內遞迴呼叫純 JavaScript 函數或方法,如下所示
mysql> CREATE FUNCTION recursive_sum(my_num INT)
-> RETURNS INT NO SQL LANGUAGE JAVASCRIPT AS
-> $$
$> function sum(n) {
$> if(n <= 1) return n
$> else return n + sum(--n)
$> }
$>
$> let x = sum(my_num)
$> return x
$> $$
-> ;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT recursive_sum(1), recursive_sum(2),
-> recursive_sum(20), recursive_sum(100)\G
*************************** 1. row ***************************
recursive_sum(1): 1
recursive_sum(2): 3
recursive_sum(20): 210
recursive_sum(100): 5050
1 row in set (0.00 sec)
遞迴深度限制為 1000。過度的遞迴可能會導致程式失敗,如下所示
mysql> SELECT recursive_sum(1000);
ERROR 6113 (HY000): JavaScript> Maximum frame limit of 1000 exceeded. Frames on stack: 1001.
MySQL 複製支援 JavaScript 儲存程式,但條件是必須在拓撲中的每個伺服器上安裝 MLE 元件。如需更多資訊,請參閱第 19.5.1.18 節,「複製和 JavaScript 儲存程式」。