Spec-Zone .ru
спецификации, руководства, описания, API

18.1. Определение Сохраненных Программ

Каждая сохраненная программа содержит тело, которое состоит из SQL-оператора. Этот оператор может быть составным оператором, составленным из нескольких операторов, разделенных точкой с запятой (;) символы. Например, следующей хранимой процедуре составляли тело a BEGIN ... END блок, который содержит a SET оператор и a 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)

Можно пересмотреть разделитель к строке кроме //, и разделитель может состоять из сингла символьные или многократные символы. Следует избежать использования наклонной черты влево ("\") символ, потому что это - символ ESC для 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)