23.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.