Spec-Zone.ru › MySQL 9.2

27.1 Определение хранимых программ

Каждая хранимая программа содержит тело, которое состоит из оператора SQL. Этот оператор может быть составным оператором, состоящим из нескольких операторов, разделённых символами с запятой (;). Например, следующая хранимая процедура имеет тело, состоящее из блока BEGIN ... END, который содержит оператор SET и цикл REPEAT, который сам содержит ещё один оператор SET:

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

Если вы используете программу-клиента mysql для определения хранимой программы, содержащей символы с запятой, возникает проблема. По умолчанию, программа-клиент mysql сама распознаёт точку с запятой как разделитель операторов, поэтому вам необходимо временно переопределить разделитель, чтобы заставить mysql передать всё определение хранимой программы серверу.

Для переопределения разделителя программы-клиента mysql используйте команду delimiter. Следующий пример показывает, как сделать это для хранимой процедуры dorepeat(), которая была показана ранее. Разделитель изменяется на //, чтобы позволить передать всё определение серверу как один оператор, а затем восстанавливается до ; перед вызовом процедуры. Это позволяет разделителю ;, используемому в теле процедуры, передаваться на сервер, а не интерпретироваться программой-клиентом mysql.

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL dorepeat(1000);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x;
+------+
| @x   |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

Вы можете переопределить разделитель на строку, отличную от //, и разделитель может состоять из одного символа или нескольких символов. Следует избегать использования обратного слэша (\), поскольку это управляющий символ для MySQL.

Следующий пример функции демонстрирует, как функция принимает параметр, выполняет операцию с использованием функции SQL и возвращает результат. В данном случае, нет необходимости использовать delimiter, поскольку определение функции не содержит внутренних разделителей операторов ;:

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
    -> RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/stored-programs-defining.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API