A stored function or stored procedure written in JavaScript is created, invoked, and maintained in much the same fashion as one written in SQL, subject to the differences listed here:
The stored program language must be declared explicitly using
LANGUAGE JAVASCRIPT
in theCREATE FUNCTION
orCREATE PROCEDURE
statement used to create the stored program; otherwise, MySQL assumes the intended language is SQL.The syntax of the routine body is checked at creation time; any errors cause the
CREATE
statement to be rejected, and the stored program not to be created.The program body must be demarcated using the
AS
keyword plus dollar-quoted delimiters such as$$
,$js$
,$mysql$
, and so on. You must use the same delimiter to mark both the beginning and end of the routine body. It is possible to use quotation marks to delimit the routine body, but dollar-quoted delimiters are preferred, since this avoids issues with quoting strings in function or procedure code. Following the first dollar-quoted delimiter, the mysql client prompt changes to$>
for each new line within the routine body, until it reaches a closing dollar-quoted delimiter, after which the prompt reverts to the default (normally->
). This can be seen in theCREATE FUNCTION
statement used to create theadd_nos()
function previously.It is not necessary to specify a statement delimiter or terminator as it is for SQL stored routines. If you employ the optional
;
character to separate JavaScript statements, this is interpeted correctly as being part of the JavaScript routine, and not as an SQL statement delimiter, as shown here: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)
To minimise possible confusion, we do not use the
;
separator for any JavaScript statements in the remaining examples in this section.The text of the routine body is always treated as
utfmb4
regardless of the character set actually used. What this means is that, whatever character set is used by the client for the routine body, the server converts it toutf8mb4
before storing it in the data dictionary. Since utf8mb4 subsumes all other supported character sets, this should not be an issue.JavaScript program argument and routine names must use the
utfmb3
character set, as with SQL stored programs. See Section 12.9, “Unicode Support”.String arguments and return types are expected to be
utf8mb4
; this means that, if the default character set of the schema to which the JavaScript stored program belongs is some other character set, all of its arguments must be declared explicitly asutf8mb4
.Input argument names must adhere to the rules for JavaScript identifiers: They can contain Unicode letters,
$
,_
, and digits (0-9), but may not start with a digit.Using a word that is reserved in JavaScript (such as
var
orfunction
) as the name of an argument raises an error. Since MySQL JavaScript stored programs always use strict mode, this also includes keywords such aspackage
andlet
. See Reserved Words for a complete listing of these. In addition, the keywordsmysql
,console
, andgraal
are also reserved by the MLE component, and cannot be used as variable or argument names in MySQL JavaScript stored programs.You can modify a JavaScript stored program using
ALTER FUNCTION
andALTER PROCEDURE
as you would an SQL stored function or procedure. Changing the language usingALTER
is not supported; in such cases, you must useDROP FUNCTION
orDROP PROCEDURE
as applicable, then re-create the stored program using the appopriateCREATE
statement.
To obtain a listing of all JavaScript stored programs in all
databases on the server, query the Information Schema
ROUTINES
table similarly to this:
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)