文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  JavaScript 儲存程式的限制與約束

27.3.8 JavaScript 儲存程式的限制與約束

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 儲存程式」