用 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)