文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  JavaScript 存储程序创建和管理

27.3.1 JavaScript 存储程序创建和管理

用 JavaScript 编写的存储函数或存储过程的创建、调用和维护方式与用 SQL 编写的存储函数或存储过程基本相同,但存在以下差异:

  • 存储程序语言必须使用 LANGUAGE JAVASCRIPTCREATE FUNCTIONCREATE 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 中的保留字(例如 varfunction)作为参数名称会导致错误。由于 MySQL JavaScript 存储程序始终使用严格模式,因此这也包括诸如 packagelet 之类的关键字。请参阅 保留字 以获取这些关键字的完整列表。此外,关键字 mysqlconsolegraal 也是 MLE 组件保留的,不能在 MySQL JavaScript 存储程序中用作变量或参数名称。

  • 可以使用 ALTER FUNCTIONALTER PROCEDURE 来修改 JavaScript 存储程序,就像修改 SQL 存储函数或过程一样。不支持使用 ALTER 更改语言;在这种情况下,必须使用 DROP FUNCTIONDROP 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)