科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道MySQL 5.0 新特性教程 存储过程:第四讲

MySQL 5.0 新特性教程 存储过程:第四讲

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将为大家介绍MySQL 5.0 新特性教程。

来源:中国IT实验室 2008年5月19日

关键字: 技巧 数据库 MySQL

  • 评论
  • 分享微博
  • 分享邮件
4. DECLARE CONTINUE HANDLER example
  
  CREATE TABLE t4 (s1 int,primary key(s1));//
  CREATE PROCEDURE p23 ()
  BEGIN
  DECLARE CONTINUE HANDLER
  FOR SQLSTATE '23000' SET @x2 = 1;
  SET @x = 1;
  INSERT INTO t4 VALUES (1);
  SET @x = 2;
  INSERT INTO t4 VALUES (1); <--
  SET @x = 3;
  END;//
  
  运行后值1被插入到主键表中。
  
  5. DECLARE CONTINUE HANDLER
  

  CREATE TABLE t4 (s1 int,primary key(s1));//
  CREATE PROCEDURE p23 ()
  BEGIN
  DECLARE CONTINUE HANDLER
  FOR SQLSTATE '23000' SET @x2 = 1;
  SET @x = 1;
  INSERT INTO t4 VALUES (1);
  SET @x = 2; <--
  INSERT INTO t4 VALUES (1);
  SET @x = 3;
  END;//
  
  然后@x的值变为2。
  
  6. DECLARE CONTINUE HANDLER example
  

  CREATE TABLE t4 (s1 int,primary key(s1));//
  CREATE PROCEDURE p23 ()
  BEGIN
  DECLARE CONTINUE HANDLER
  FOR SQLSTATE '23000' SET @x2 = 1;
  SET @x = 1;
  INSERT INTO t4 VALUES (1);
  SET @x = 2;
  INSERT INTO t4 VALUES (1); <--
  SET @x = 3;
  END;//
  
  然后程序尝试再次往主键表中插入数值,但失败了,因为主键有唯一性限制。
  
  7. DECLARE CONTINUE HANDLER example
  

  CREATE TABLE t4 (s1 int,primary key(s1));//
  CREATE PROCEDURE p23 ()
  BEGIN
  DECLARE CONTINUE HANDLER
  FOR SQLSTATE '23000' SET @x2 = 1; <--
  SET @x = 1;
  INSERT INTO t4 VALUES (1);
  SET @x = 2;
  INSERT INTO t4 VALUES (1);
  SET @x = 3;
  END;//
  
  由于插入失败,错误处理程序被触发,开始进行错误处理。下一个执行的语句是错误处理的语句,@x2被设为2。
  
  8. DECLARE CONTINUE HANDLER example
  

  CREATE TABLE t4 (s1 int,primary key(s1));//
  CREATE PROCEDURE p23 ()
  BEGIN
  DECLARE CONTINUE HANDLER
  FOR SQLSTATE '23000' SET @x2 = 1;
  SET @x = 1;
  INSERT INTO t4 VALUES (1);
  SET @x = 2;
  INSERT INTO t4 VALUES (1);
  SET @x = 3; <--
  END;//
  
  到这里并没有结束,因为这是CONTINUE异常处理。所以执行返回到失败的插入语句之后,继续执行将@x设定为3动作。
  
  9. DECLARE CONTINUE HANDLER example
  

  mysql> CALL p23()//
  Query OK, 0 rows affected (0.00 sec)
  mysql> SELECT @x, @x2//
  
  +------+------+
  | @x | @x2 |
  +------+------+
  | 3 | 1 |
  +------+------+
  1 row in set (0.00 sec)
  
  运行过程后我们观察@x的值,很确定的可以知道是3,观察@x2的值,为1。从这里可以判断程序运行无误,完全按照我们的思路进行。大家可以花点时间去调整错误处理器,让检查放在语句段的首部,而不是放在可能出现错误的地方,虽然那样看起来程序很紊乱,跳来跳去的感觉。但是这样的代码很安全也很清楚。
  
  1. DECLARE CONDITION
  

  CREATE PROCEDURE p24 ()
  BEGIN
  DECLARE `Constraint Violation`
  CONDITION FOR SQLSTATE '23000';
  DECLARE EXIT HANDLER FOR
  `Constraint Violation` ROLLBACK;
  START TRANSACTION;
  INSERT INTO t2 VALUES (1);
  INSERT INTO t2 VALUES (1);
  COMMIT;
  END; //
  
  这是另外一个错误处理的例子,在前面的基础上修改的。事实上你可给SQLSTATE或者错误代码其他的名字,你就可以在处理中使用自己定义的名字了。下面看它是怎么实现的:我把表t2定义为InnoDB表,所以对这个表的插入操作都会ROLLBACK(回滚),ROLLBACK(回滚事务)也是恰好会发生的。因为对主键插入两个同样的值会导致SQLSTATE 23000错误发生,这里SQLSTATE 23000是约束错误。
  
  2. DECLARE CONDITION声明条件
  

  CREATE PROCEDURE p24 ()
  BEGIN
  DECLARE `Constraint Violation`
  CONDITION FOR SQLSTATE '23000';
  DECLARE EXIT HANDLER FOR
  `Cons
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章