> 数据库 > MySQL >

MySQL 存储过程的异常处理


mysql>
mysql> delimiter $$
mysql>
mysql> CREATE PROCEDURE myProc
 -> (p_first_name VARCHAR(30),
 -> p_last_name VARCHAR(30),
 -> p_city VARCHAR(30),
 -> p_description VARCHAR(30),
 -> OUT p_sqlcode INT,
 -> OUT p_status_message VARCHAR(100))
 -> BEGIN
->
 -> 
->
 -> DECLARE duplicate_key CONDITION FOR 1062;
 -> DECLARE foreign_key_violated CONDITION FOR 1216;
->
 -> 
->
 -> 
->
 -> DECLARE l_manager_id INT;
->
 -> DECLARE csr_mgr_id CURSOR FOR
 -> SELECT id
 -> FROM employee
 -> WHERE first_name=p_first_name
 -> AND last_name=p_last_name;
->
 -> 
->
 -> 
->
 -> DECLARE CONTINUE HANDLER FOR duplicate_key
 -> BEGIN
 -> SET p_sqlcode=1052;
 -> SET p_status_message='Duplicate key error';
 -> END;
->
 -> DECLARE CONTINUE HANDLER FOR foreign_key_violated
 -> BEGIN
 -> SET p_sqlcode=1216;
 -> SET p_status_message='Foreign key violated';
 -> END;
->
 -> DECLARE CONTINUE HANDLER FOR not FOUND
 -> BEGIN
 -> SET p_sqlcode=1329;
 -> SET p_status_message='No record found';
 -> END;
->
 -> 
->
 -> 
->
 -> SET p_sqlcode=0;
 -> OPEN csr_mgr_id;
 -> FETCH csr_mgr_id INTO l_manager_id;
->
 -> IF p_sqlcode<>0 THEN 
 -> SET p_status_message=CONCAT(p_status_message,' when fetching manager id');
 -> ELSE
 -> INSERT INTO employee (first_name,id,city)
 -> VALUES(p_first_name,l_manager_id,p_city);
->
 -> IF p_sqlcode<>0 THEN 
 -> SET p_status_message=CONCAT(p_status_message,
 -> ' when inserting new department');
 -> END IF;
 -> END IF;
->
 -> CLOSE csr_mgr_id;
->
 -> 
->
 -> END$$
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> delimiter ;
mysql> set @myCode = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> set @myMessage = 0;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> call myProc('Jason','Martin','New City','New Description',@myCode,@myMessage);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select @myCode, @myMessage;
+---------+------------+
| @myCode | @myMessage |
+---------+------------+
| 0 | NULL |
+---------+------------+
1 row in set (0.00 sec)

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






(责任编辑:IT)