27.3.1 Создание и управление хранимыми программами JavaScript
Хранимая функция или хранимая процедура, написанная на JavaScript, создается, вызывается и поддерживается аналогично тем, которые написаны на SQL, с учетом перечисленных ниже различий:
-
Язык хранимой программы должен быть явно объявлен с помощью
LANGUAGE JAVASCRIPTв оператореCREATE FUNCTIONилиCREATE PROCEDURE, используемом для создания хранимой программы; в противном случае MySQL предполагает, что целевой язык — SQL.Синтаксис тела процедуры проверяется во время создания; любые ошибки приводят к отклонению оператора
CREATEи к тому, что хранимая программа не создается. Тело программы должно быть обозначено ключевым словом
ASи долларовыми разделителями, такими как$$,$js$,$mysql$и так далее. Вы должны использовать тот же разделитель для обозначения начала и конца тела процедуры. Можно использовать кавычки для разграничения тела процедуры, но долларовые разделители предпочтительнее, поскольку это предотвращает проблемы с экранированием строк в коде функции или процедуры. После первого долларового разделителя приглашение клиента mysql меняется на$>для каждой новой строки в теле процедуры, пока не встретится закрывающийся доллар-разделитель, после чего приглашение возвращается к значению по умолчанию (обычно->). Это можно увидеть в оператореCREATE FUNCTION, используемом для создания функцииadd_nos()ранее.-
Необязательно указывать разделитель или терминатор операторов, как это делается для 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) в качестве имени аргумента приводит к ошибке. Поскольку хранимые программы JavaScript MySQL всегда используют строгий режим, это также включает ключевые слова, такие какpackageиlet. Полный список этих слов см. в Зарезервированные слова. Кроме того, ключевые словаmysql,consoleиgraalтакже зарезервированы компонентом MLE и не могут использоваться в качестве имен переменных или аргументов в хранимых программах MySQL JavaScript. -
Вы можете изменить хранимую JavaScript-программу, используя
ALTER FUNCTIONиALTER PROCEDURE, как и SQL-хранимые функции или процедуры. Изменение языка с помощьюALTERне поддерживается; в таких случаях необходимо использоватьDROP FUNCTIONилиDROP PROCEDURE(в зависимости от случая), а затем пересоздать хранимую программу с помощью соответствующего оператораCREATE.
Для получения списка всех хранимых JavaScript-программ во всех базах данных на сервере, запросите таблицу схемы Информации 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)
© 2025 Oracle
Licensed under the GPLv2 License.