Spec-Zone .ru
спецификации, руководства, описания, API
|
Каждая сохраненная программа содержит тело, которое состоит из 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)