文档首页
MySQL 9.0 参考手册
相关文档 下载本手册

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