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 存储程序”。