这篇文章主要介绍了MySQL存储过程的异常处理方法,可实现有效调试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
- ->
- -> /* START Declare Conditions */
- ->
- -> DECLARE duplicate_key CONDITION FOR 1062;
- -> DECLARE foreign_key_violated CONDITION FOR 1216;
- ->
- -> /* END Declare Conditions */
- ->
- -> /* START Declare variables and cursors */
- ->
- -> 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;
- ->
- -> /* END Declare variables and cursors */
- ->
- -> /* START Declare Exception Handlers */
- ->
- -> 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;
- ->
- -> /* END Declare Exception Handlers */
- ->
- -> /* START Execution */
- ->
- -> SET p_sqlcode=0;
- -> OPEN csr_mgr_id;
- -> FETCH csr_mgr_id INTO l_manager_id;
- ->
- -> IF p_sqlcode<>0 THEN /* Failed to get manager id*/
- -> 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 /* Failed to insert new department */
- -> SET p_status_message=CONCAT(p_status_message,
- -> ' when inserting new department');
- -> END IF;
- -> END IF;
- ->
- -> CLOSE csr_mgr_id;
- ->
- -> /* END Execution */
- ->
- -> 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)
希望本文所述对大家的MySQL数据库程序设计有所帮助。
新闻热点
疑难解答