MySQL 存储过程的异常处理

[代码] SQL异常处理

001mysql>
002mysql> delimiter $$
003mysql>
004mysql> CREATE PROCEDURE myProc
005    ->     (p_first_name          VARCHAR(30),
006    -> p_last_name VARCHAR(30),
007    ->       p_city                VARCHAR(30),
008    ->       p_description         VARCHAR(30),
009    ->       OUT p_sqlcode         INT,
010    ->       OUT p_status_message  VARCHAR(100))
011    -> BEGIN
012    ->
013    -> /* START Declare Conditions */
014    ->
015    ->   DECLARE duplicate_key CONDITION FOR 1062;
016    ->   DECLARE foreign_key_violated CONDITION FOR 1216;
017    ->
018    -> /* END Declare Conditions */
019    ->
020    -> /* START Declare variables and cursors */
021    ->
022    ->      DECLARE l_manager_id       INT;
023    ->
024    ->      DECLARE csr_mgr_id CURSOR FOR
025    ->       SELECT id
026    ->         FROM employee
027    ->        WHERE first_name=p_first_name
028    ->              AND last_name=p_last_name;
029    ->
030    -> /* END Declare variables and cursors */
031    ->
032    -> /* START Declare Exception Handlers */
033    ->
034    ->   DECLARE CONTINUE HANDLER FOR duplicate_key
035    ->     BEGIN
036    ->       SET p_sqlcode=1052;
037    ->       SET p_status_message='Duplicate key error';
038    ->     END;
039    ->
040    ->   DECLARE CONTINUE HANDLER FOR foreign_key_violated
041    ->     BEGIN
042    ->       SET p_sqlcode=1216;
043    ->       SET p_status_message='Foreign key violated';
044    ->     END;
045    ->
046    ->   DECLARE CONTINUE HANDLER FOR not FOUND
047    ->     BEGIN
048    ->       SET p_sqlcode=1329;
049    ->       SET p_status_message='No record found';
050    ->     END;
051    ->
052    -> /* END Declare Exception Handlers */
053    ->
054    -> /* START Execution */
055    ->
056    ->   SET p_sqlcode=0;
057    ->   OPEN csr_mgr_id;
058    ->   FETCH csr_mgr_id INTO l_manager_id;
059    ->
060    ->   IF p_sqlcode<>0 THEN           /* Failed to get manager id*/
061    ->     SET p_status_message=CONCAT(p_status_message,' when fetching manager id');
062    ->   ELSE
063    ->     INSERT INTO employee (first_name,id,city)
064    ->     VALUES(p_first_name,l_manager_id,p_city);
065    ->
066    ->     IF p_sqlcode<>0 THEN     /* Failed to insert new department */
067    ->       SET p_status_message=CONCAT(p_status_message,
068    ->                            ' when inserting new department');
069    ->     END IF;
070    ->   END IF;
071    ->
072    ->   CLOSE csr_mgr_id;
073    ->
074    -> /* END Execution */
075    ->
076    -> END$$
077Query OK, 0 rows affected (0.02 sec)
078 
079mysql>
080mysql> delimiter ;
081mysql> set @myCode = 0;
082Query OK, 0 rows affected (0.00 sec)
083 
084mysql> set @myMessage = 0;
085Query OK, 0 rows affected (0.00 sec)
086 
087mysql>
088mysql> call myProc('Jason','Martin','New City','New Description',@myCode,@myMessage);
089Query OK, 1 row affected (0.00 sec)
090 
091mysql>
092mysql> select @myCode, @myMessage;
093+---------+------------+
094| @myCode | @myMessage |
095+---------+------------+
096| 0       | NULL       |
097+---------+------------+
0981 row in set (0.00 sec)
099 
100mysql>
101mysql> drop procedure myProc;
102Query OK, 0 rows affected (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值