27.3.6.8 API хранимых процедур
Две функции, перечисленные ниже, предоставляют JavaScript Function объекты, отражающие хранимые процедуры MySQL:
getFunction(): Получение экземпляраFunctionпо имени хранимой функции.getProcedure(): Получение экземпляраFunctionпо имени хранимой процедуры.
Используйте метод close() для закрытия ресурса, связанного с хранимой процедурой. Если после закрытия процедура будет вызвана повторно, или если ее метод close() будет вызван повторно, произойдет ошибка.
Следующий пример создает две хранимые функции getArea() и getDiag(), затем создает и выполняет хранимую процедуру procRect, которая использует эти функции, создавая их экземпляры и выполняя их с помощью объектов Function.
mysql> CREATE FUNCTION getArea(w INT, h INT)
-> RETURNS INT DETERMINISTIC
-> RETURN w * h;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE FUNCTION getDiag(w INT, h INT)
-> RETURNS FLOAT DETERMINISTIC
-> RETURN Math.sqrt(Math.pow(w, 2) + Math.pow(h, 2));
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE procRect(IN x INT, IN y INT) LANGUAGE JAVASCRIPT
-> AS $$
$> console.clear()
$>
$> let s = session.getDefaultSchema()
$> let f = s.getFunction("getArea")
$> let g = s.getFunction("getDiag")
$>
$> let a = x
$> let b = y
$>
$> console.log (
$> "Width: " + a + ", Height: " + b + "; Area: " +
$> f(a,b) + "; Diagonal: " + g(a,b)
$> )
$>
$> f.close()
$> g.close()
$> $$;
Query OK, 0 rows affected (0.01 sec)
mysql> CALL procRect(5, 10);
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT mle_session_state("stdout")\G
*************************** 1. row ***************************
mle_session_state("stdout"): Width: 5, Height: 10; Area: 50; Diagonal: 11.180339813232422
1 row in set (0.00 sec)
mysql> CALL procRect(2, 25);
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT mle_session_state("stdout")\G
*************************** 1. row ***************************
mle_session_state("stdout"): Width: 2, Height: 25; Area: 50; Diagonal: 25.079872131347656
1 row in set (0.00 sec)
Для хранимых функций аргументы передаются по значению, как показано в приведенных выше примерах с getDiag() и getArea(). Для хранимых процедур обработка аргументов осуществляется следующим образом:
Параметр
IN: Значения параметров передаются напрямую.Параметр
OUTилиINOUT: Для хранения выходного значения параметра необходимо создать заполнитель, используя функциюmysql.arg().my.arg()обсуждается в следующих нескольких абзацах этого раздела.
mysql.arg(). Эта функция всегда вызывается как метод глобального объекта mysql. Она создает объект Argument, которому можно присвоить значение при создании или при вызове процедуры. Позже значение можно получить как . Это показано в следующем примере, где экземпляры аргументов argument.vala и b создаются в use_my_proc(), чтобы выступать в качестве заполнителей для y и z в my_proc():
mysql> CREATE PROCEDURE my_proc(
-> IN x INT,
-> OUT y VARCHAR(20),
-> INOUT z TEXT
-> )
-> LANGUAGE JAVASCRIPT
-> AS $$
$> y = "Hello world " + x
$> z += "Hello again JS"
$> $$;
Query OK, 0 rows affected (0.04 sec)
mysql> CREATE PROCEDURE use_my_proc() LANGUAGE JAVASCRIPT
-> AS $$
$> console.clear()
$>
$> let s = session.getDefaultSchema()
$> let p = s.getProcedure("my_proc")
$>
$> let a = mysql.arg()
$> let b = mysql.arg("World ")
$>
$> p(42, a, b)
$>
$> console.log(a.val)
$> console.log(b.val)
$>
$> p.close()
$> $$;
Query OK, 0 rows affected (0.01 sec)
mysql> CALL use_my_proc();
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT mle_session_state("stdout")\G
*************************** 1. row ***************************
mle_session_state("stdout"): Hello world 42
World Hello again JS
1 row in set (0.00 sec)
Экземпляр Argument может быть создан только путем вызова mysql.arg() и доступен только через свойство val. В противном случае он недоступен.
Соответствия между типами MySQL параметров OUT или INOUT и типами JavaScript показаны в следующей таблице:
| Тип MySQL | Тип JavaScript | Примечания |
|---|---|---|
NULL |
null |
- |
BIGINT |
Number, String, BigInt
|
Зависит от значения параметра integerType метода session.sql() |
DECIMAL |
- | Ошибка: неподдерживаемый тип |
DOUBLE |
Number |
- |
Бинарная строка (BINARY, BLOB) |
Uint8Array |
- |
Небинарная строка (TEXT) |
String |
- |
VECTOR |
Float32Array |
- |
JSON |
Object |
- |
DATE, DATETIME, TIMESTAMP
|
Date |
- |
ENUM |
String |
- |
SET |
Set (String) |
JavaScript массив может быть преобразован в строку, разделённую запятыми |
© 2025 Oracle
Licensed under the GPLv2 License.