用 JavaScript 编写的存储函数或存储过程的创建、调用和维护方式与用 SQL 编写的存储函数或存储过程基本相同,但存在以下差异:
存储程序语言必须使用
LANGUAGE JAVASCRIPT在CREATE FUNCTION或CREATE PROCEDURE语句中显式声明,用于创建存储程序;否则,MySQL 假设目标语言是 SQL。例程体的语法在创建时会进行检查;任何错误都会导致
CREATE语句被拒绝,并且不会创建存储程序。程序体必须使用
AS关键字加上美元引号定界符,例如$$、$js$、$mysql$等来分隔。必须使用相同的定界符来标记例程体的开头和结尾。可以使用引号来分隔例程体,但建议使用美元引号定界符,因为这样可以避免在函数或过程代码中引用字符串时出现问题。在第一个美元引号定界符之后,mysql 客户端提示符会为例程体内的每一行更改为$>,直到它到达一个关闭的美元引号定界符,之后提示符会恢复为默认值(通常为->)。这可以在用于创建前面提到的add_nos()函数的CREATE FUNCTION语句中看到。无需指定语句分隔符或终止符,如 SQL 存储例程一样。如果使用可选的
;字符来分隔 JavaScript 语句,则会将其正确地解释为 JavaScript 例程的一部分,而不是作为 SQL 语句分隔符,如下所示:mysql> CREATE FUNCTION js_pow(arg1 INT, arg2 INT) -> RETURNS INT LANGUAGE JAVASCRIPT -> AS -> $$ $> let x = Math.pow(arg1, arg2); $> return x; $> $$ -> ; Query OK, 0 rows affected (0.02 sec) mysql> SELECT js_pow(2,3); +-------------+ | js_pow(2,3) | +-------------+ | 8 | +-------------+ 1 row in set (0.00 sec)为了最大程度地减少可能的混淆,本节中其余示例中不会使用任何 JavaScript 语句的
;分隔符。例程体的文本始终被视为
utfmb4,与实际使用的字符集无关。这意味着,无论客户端为例程体使用什么字符集,服务器都会在将它存储在数据字典中之前将其转换为utf8mb4。由于 utf8mb4 包含所有其他支持的字符集,因此这应该不会构成问题。JavaScript 程序参数和例程名称必须使用
utfmb3字符集,与 SQL 存储程序一样。请参阅 第 12.9 节,“Unicode 支持”。字符串参数和返回类型预计为
utf8mb4;这意味着,如果 JavaScript 存储程序所属架构的默认字符集是其他一些字符集,则所有参数必须显式声明为utf8mb4。输入参数名称必须遵守 JavaScript 标识符规则:它们可以包含 Unicode 字母、
$、_和数字 (0-9),但不能以数字开头。使用 JavaScript 中的保留字(例如
var或function)作为参数名称会导致错误。由于 MySQL JavaScript 存储程序始终使用严格模式,因此这也包括诸如package和let之类的关键字。请参阅 保留字 以获取这些关键字的完整列表。此外,关键字mysql、console和graal也是 MLE 组件保留的,不能在 MySQL JavaScript 存储程序中用作变量或参数名称。可以使用
ALTER FUNCTION和ALTER PROCEDURE来修改 JavaScript 存储程序,就像修改 SQL 存储函数或过程一样。不支持使用ALTER更改语言;在这种情况下,必须使用DROP FUNCTION或DROP PROCEDURE(视情况而定),然后使用相应的CREATE语句重新创建存储程序。
要获取服务器上所有数据库中所有 JavaScript 存储程序的列表,请查询 Information Schema ROUTINES 表,类似于以下示例:
mysql> SELECT CONCAT(ROUTINE_SCHEMA, '.', ROUTINE_NAME) AS "JS Stored Routines"
-> FROM INFORMATION_SCHEMA.ROUTINES
-> WHERE EXTERNAL_LANGUAGE="JAVASCRIPT";
+------------------------+
| JS Stored Routines |
+------------------------+
| test.pc1 |
| test.pc2 |
| world.jssp_simple1 |
| test.jssp_vsimple |
| test.jssp_simple |
| world.jssp_vsimple |
| world.jssp_vsimple2 |
| world.jssp_simple_meta |
+------------------------+
8 rows in set (0.00 sec)