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 存储过程的异常处理的更多相关文章

  1. mysql存储过程之异常处理篇

    mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[, ...

  2. 详解MySQL存储过程的“异常处理”

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  3. MySQL存储过程的异常处理

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  4. MySQL存储过程学习笔记

    MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...

  5. MYSQL 存储过程 多表更新异常捕捉和异常处理方式

    今天在做MYSQL 存储过程 多表更新的功能   多表更新时候注意事项 1.首先是确保多表更新能够一次执行,途中没有哪个表的sql语句错误 2.上线后修改表结构及字段,请注意检查是否影响mysql 过 ...

  6. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  7. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  8. mysql存储过程之游标遍历数据表

    原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕 ...

  9. MySQL 存储过程 经常使用语法

    MySQL 存储过程是从 MySQL 5.0 開始添加的新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装.特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库 ...

随机推荐

  1. Androlid入门之文件系统操作(三)文件读写

         import java.io.*; import android.app.Activity; import android.os.Bundle; import android.view.Vi ...

  2. Spark之MLlib

    目录 Part VI. Advanced Analytics and Machine Learning Advanced Analytics and Machine Learning Overview ...

  3. 第7章 Android中访问网络资源

    http://developer.android.com/index.html->https://developer.android.com/index.html https://develop ...

  4. PCB Genesis加二维码 实现方式

    使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...

  5. Candies(差分约束系统)

    http://poj.org/problem?id=3159 思路:用O(V+ElogV)的Dijkstra算法求1到n的最短路.即用优先队列优化Dijkstra算法. #include <st ...

  6. ThreadLocal类详解

    学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么.所以我们先来看看ThreadLocal对我们到底有什么用,然后再来看看它的实现原理. ThreadLocal如果单纯从名字上来看像是“本地 ...

  7. Java 精度控制

    四舍五入,保留两位小数 (找了很多种方法,都有问题,测试得出下面这种方式是可用的) String str="0.235"; String.format("%.2f&quo ...

  8. 浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  9. C#使用各种时间戳及转换

    /// <summary> /// DateTime时间格式转换为13位带毫秒的Unix时间戳 /// </summary> /// <param name=" ...

  10. 2星|《工业X.0》:物联网的资料汇编

    工业X.0:实现工业领域数字价值 看完比较失望,没有看到新的观点想法.基本算是物联网的资料汇编.总体评价2星. 以下是书中一些内容的摘抄: 1:例如,埃森哲为其员工开发了一个用例,用增强现实技术解决实 ...