Declaring a Condition and Handler : Condition HANDLER « Procedure Function « MySQL Tutorial






Handlers are designed to detect certain errors or warnings and allow you to take action.

For example, a truncation issues a warning and returns an error, and also sets the SQLSTATE.

For the details of each error number and its meaning, see http://dev.mysql.com/doc/mysql/en/Error-handling.html.

A handler is declared with a handler type, condition, and statement:

DECLARE <handler type> HANDLER FOR <condition> <statement>;

Handler Types

The handler type is either CONTINUE or EXIT.

CONTINUE means that when a certain error or warning is issued, MySQL will run the provided statement and continue running the statements.

EXIT tells MySQL that when the condition is met, it should run the statement and exit the current BEGIN ... END block.

Here's a handler statement with an EXIT handler type:

DECLARE EXIT HANDLER FOR truncated_name
   UPDATE employee SET first_name = first_name WHERE id = 1;

The following table shows the MySQL handler conditions.

ConditionDescription
SQLSTATE ''A specific warning or error number. The number must be enclosed in single quotes.
The name of the self-defined condition created using the DECLARE ... CONDITION statement.
SQLWARNINGMatches any SQLSTATE that begins with 01.
NOT FOUNDMatches any SQLSTATE beginning with 02.
SQLEXCEPTIONMatches every SQLSTATE except those beginning with 01 or 02.
Using a specific error will cause the handler to execute for the specific MySQL error.


mysql>
mysql>
mysql> CREATE TABLE Employee(
    ->     id            int,
    ->     first_name    VARCHAR(15),
    ->     last_name     VARCHAR(15),
    ->     start_date    DATE,
    ->     end_date      DATE,
    ->     salary        FLOAT(8,2),
    ->     city          VARCHAR(10),
    ->     description   VARCHAR(15)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql>
mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->              values (1,'Jason',    'Martin',  '19960725',  '20060725', 1234.56, 'Toronto',  'Programmer');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(2,'Alison',   'Mathews',  '19760321', '19860221', 6661.78, 'Vancouver','Tester');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(3,'James',    'Smith',    '19781212', '19900315', 6544.78, 'Vancouver','Tester');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(4,'Celia',    'Rice',     '19821024', '19990421', 2344.78, 'Vancouver','Manager');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(5,'Robert',   'Black',    '19840115', '19980808', 2334.78, 'Vancouver','Tester');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(6,'Linda',    'Green',    '19870730', '19960104', 4322.78,'New York',  'Tester');
Query OK, 1 row affected (0.02 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(7,'David',    'Larry',    '19901231', '19980212', 7897.78,'New York',  'Manager');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into Employee(id,first_name, last_name, start_date, end_Date,   salary,  City,       Description)
    ->               values(8,'James',    'Cat',     '19960917',  '20020415', 1232.78,'Vancouver', 'Tester');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from Employee;
+------+------------+-----------+------------+------------+---------+-----------+-------------+
| id   | first_name | last_name | start_date | end_date   | salary  | city      | description |
+------+------------+-----------+------------+------------+---------+-----------+-------------+
|    1 | Jason      | Martin    | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto   | Programmer  |
|    2 | Alison     | Mathews   | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester      |
|    3 | James      | Smith     | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester      |
|    4 | Celia      | Rice      | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager     |
|    5 | Robert     | Black     | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester      |
|    6 | Linda      | Green     | 1987-07-30 | 1996-01-04 | 4322.78 | New York  | Tester      |
|    7 | David      | Larry     | 1990-12-31 | 1998-02-12 | 7897.78 | New York  | Manager     |
|    8 | James      | Cat       | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester      |
+------+------------+-----------+------------+------------+---------+-----------+-------------+
8 rows in set (0.00 sec)

mysql>
mysql>
mysql>
mysql> DELIMITER //
mysql> CREATE PROCEDURE update_name (IN cust_id INT, IN new_name VARCHAR(20))
    -> BEGIN
    ->         DECLARE old_name VARCHAR(10);
    ->         DECLARE truncated_name CONDITION for 1265;
    ->         DECLARE EXIT HANDLER FOR truncated_name
    ->            UPDATE employee SET first_name = old_name WHERE id = cust_id;
    ->
    ->         SELECT first_name INTO old_name FROM employee WHERE id = cust_id;
    ->         UPDATE employee SET first_name = new_name WHERE id = cust_id;
    ->
    ->         SELECT id,first_name FROM employee WHERE id = cust_id;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> call update_name(1,'New Name');
+------+------------+
| id   | first_name |
+------+------------+
|    1 | New Name   |
+------+------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> drop procedure update_name;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>
mysql> select * from Employee;
+------+------------+-----------+------------+------------+---------+-----------+-------------+
| id   | first_name | last_name | start_date | end_date   | salary  | city      | description |
+------+------------+-----------+------------+------------+---------+-----------+-------------+
|    1 | New Name   | Martin    | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto   | Programmer  |
|    2 | Alison     | Mathews   | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester      |
|    3 | James      | Smith     | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester      |
|    4 | Celia      | Rice      | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager     |
|    5 | Robert     | Black     | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester      |
|    6 | Linda      | Green     | 1987-07-30 | 1996-01-04 | 4322.78 | New York  | Tester      |
|    7 | David      | Larry     | 1990-12-31 | 1998-02-12 | 7897.78 | New York  | Manager     |
|    8 | James      | Cat       | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester      |
+------+------------+-----------+------------+------------+---------+-----------+-------------+
8 rows in set (0.00 sec)

mysql>
mysql>
mysql> drop table Employee;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>








11.44.Condition HANDLER
11.44.1.Declaring a Condition and Handler
11.44.2.Condition and Handler in action
11.44.3.DECLARE CONTINUE HANDLER FOR NOT FOUND SET
11.44.4.Checking flag
11.44.5.Using while to check the condition
11.44.6.DECLARE EXIT HANDLER FOR
11.44.7.Checking Exit flag
11.44.8.Using the IF statement to verify 'CONTINUE HANDLER'
11.44.9.The example associates a handler with SQLSTATE 23000, which occurs for a duplicate-key error
11.44.10.To ignore a condition