Oracle 近日在新的 MySQL 8.2 预览版中增加了 JavaScript 存储过程。
当前,已经在企业版或 AWS、Azure 或 OCI(Oracle 云基础设施)上的 MySQL Heatwave 云服务中提供给用户使用。
其JavaScript 存储过程由 GraalVM 运行时执行,它支持 JavaScript 和 Java代码。
从使用 JavaScript 的开发人员数量而言,它是全球最流行的编程语言,但许多开发者对在数据库引擎中将 JavaScript 与 SQL 混合使用持谨慎态度。
有开发者对此评论说:
“作为一个仍然从事 Java 存储过程工作的人,请Oracle不要这么干”。
因为混合语言可能会导致混乱,并引入诸如数据类型,还有如何从 JavaScript(动态语言)转换为 SQL(例如从函数返回时)之类的问题。
关于有多少编程逻辑属于数据库,而不是应用程序代码,也存在着长期的争论。在存储过程中运行代码有利于性能,因为它尽最大可能靠近数据运行,但与应用程序代码与数据库引擎分离时相比,此类代码不太明显,并且可能更难以排除故障与性能维护。
Oracle 表示说,JavaScript 存储过程和函数支持许多场景,还包括使用Mustache等模板系统进行数据格式化、复杂验证、数据压缩和编码以及数据转换。
JavaScript 函数和过程是在 CREATE FUNCTION 或 CREATE PROCEDURE 语句中使用 LANGUAGE JAVASCRIPT 创建的。
创建后,可以在任何可以使用它们的地方以 SQL 语句调用它们,包括触发器(在插入、删除和更新之前或之后自动执行的代码)。JavaScript 的异常会转换为 MySQL 错误。
GraalVM 的 AOT(提前)编译增强了性能,如果语法错误将会让 CREATE 语句失败。
目前,此项功能的技术文档将其描述为技术预览版,并警告开发者“暂时不要在生产环境中使用这些二进制文件”。
它进一步说明 JavaScript 支持符合 ECMAScript 2021 规范。可以使用多语言引擎组件 (MLE) 进行调试,这是 JavaScript 支持所必需的,包括在发生错误时访问堆栈跟踪。
此外,文档中还有关于使用全局变量的警告:
“支持 Global 对象和 globalThis 对象属性,但它们的范围仅限于当前用户会话的范围。在同一会话中执行的多个存储程序(或同一程序的多个实例)时可以共享这些对象,但不建议这样做,因为它们在这种情况下的行为不是确定性的,”