23.1 Defining Stored Programs

Each stored program contains a body that consists of an SQL statement. This statement may be a compound statement made up of several statements separated by semicolon (';') characters. For example, the following stored procedure has a body made up of a note 'BEGIN ... END': begin-end. block that contains a note 'SET': set-variable. statement and a note 'REPEAT': repeat. loop that itself contains another note 'SET': set-variable. statement:

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

If you use the note 'mysql': mysql. client program to define a stored program containing semicolon characters, a problem arises. By default, note 'mysql': mysql. itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause *note 'mysql': mysql. to pass the entire stored program definition to the server.

To redefine the note 'mysql': mysql. delimiter, use the 'delimiter' command. The following example shows how to do this for the 'dorepeat()' procedure just shown. The delimiter is changed to '//' to enable the entire definition to be passed to the server as a single statement, and then restored to ';' before invoking the procedure. This enables the ';' delimiter used in the procedure body to be passed through to the server rather than being interpreted by note 'mysql': mysql. itself.

 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)

You can redefine the delimiter to a string other than '//', and the delimiter can consist of a single character or multiple characters. You should avoid the use of the backslash ('') character because that is the escape character for MySQL.

The following is an example of a function that takes a parameter, performs an operation using an SQL function, and returns the result. In this case, it is unnecessary to use 'delimiter' because the function definition contains no internal ';' statement delimiters:

 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)

 File: manual.info.tmp, Node: stored-routines, Next: triggers, Prev: stored-programs-defining, Up: stored-objects