美文网首页
mysql异常处理 handler

mysql异常处理 handler

作者: 一曲三月 | 来源:发表于2021-07-19 18:36 被阅读0次

    -- 异常处理
    DECLARE
    {EXIT | CONTINUE}
    HANDLER FOR
    {error-number | SQLSTATE error-string | condition}
    SQL statement
    --
    Handler Type (CONTINUE,EXIT)//处理类型 继续或退出

    Handler condition (SQLSTATE,MYSQL ERROR,CONDITION)//触发条件

    Handler actions(错误触发的操作)

    1、exit只退出当前的block。exit 意思是当动作成功提交后,退出所在的复合语句。即declare exit handler for... 所在的复合语句。

    2、如果定义了handler action,会在continue或exit之前执行

    发生错误的条件有:

    1、MYSQL错误代码

    2、ANSI-standard SQLSTATE code

    3、命名条件。可使用系统内置的SQLEXCEPTION,SQLWARNING和NOT FOUND

    作用域:

    1、包括begin...end内的语句
    DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION
    BEGIN
    GET DIAGNOSTICS CONDITION 1 code = RETURNED_SQLSTATE , msg = MESSAGE_TEXT;
    SET p_RETURN_MESSAGE = concat('Exception Occur!',debug_info,':',ifnull(code,''),'-',ifnull(msg,''));
    set p_RETURN_CODE = -1;
    #ROLLBACK;
    END;
    2、若错误处理在begin...end内定义,则在之外的语句不会触发错误发生
    BEGIN
    BEGIN
    DECLARE CONTINUE HANDLER FOR ......
    END;
    INSERT INTO 表;
    END;
    3、能够捕获其它存储过程抛出的错误
    --
    SQL 语句生成填充诊断区域的诊断信息。
    该GET DIAGNOSTICS语句使应用程序能够检查此信息。它从 MySQL 5.6.4 开始可用
    在MySQL存储过中处理SQLEXCEPTION的时候,如果你是使用GET CURRENT DIAGNOSTICS CONDITION 1 @SQL_MSG_CODE = RETURNED_SQLSTATE,@SQL_MSG_TEXT = MESSAGE_TEXT;的方式来读取那么每次显示的都是第一次报错的消息
    要获取语句信息,请将所需的语句项检索到目标变量中。此实例 GET DIAGNOSTICS将可用条件的数量和受影响的行数分配给用户变量@p1和 @p2:
    GET DIAGNOSTICS @p1 = NUMBER, @p2 = ROW_COUNT;
    要获取条件信息,请指定条件编号并将所需条件项检索到目标变量中。此实例GET DIAGNOSTICS将 SQLSTATE 值和错误消息分配给用户变量,@p3并且 @p4:
    GET DIAGNOSTICS CONDITION 1
    @p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT;
    --
    MySQL客户端shell关于“自动提交”和“事务”的参数是autocommit,默认值是1,即默认开启自动提交,事务不开启。
    所以当你每次使用insert、delete、update等语句的时候,数据表实际就会完成更改。
    除了配置开启事务,也可以直接使用start transaction开启事务。
    这种方式在当你使用commit或者rollback后,事务就结束了
    再次进入事务状态需要再次start transaction
    事务未COMMIT可以回滚,COMMIT之后不可以回滚。
    ?怎么回滚已经提交的数据
    ?Mysql中key 、primary key 、unique key 与index区别
    --
    SQL 语句的执行处理
    1,即时 SQL
    一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:
      1. 词法和语义解析;
      2. 优化 SQL 语句,制定执行计划;
      3. 执行并返回结果;
      如上,一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)。
    2、预处理 SQL
    绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同),
    所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。
    预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

    定义预处理语句

    PREPARE stmt FROM preparable_stmt;

    执行预处理语句

    EXECUTE stmt [USING @var_name [, @var_name] ...];

    删除(释放)定义

    {DEALLOCATE | DROP} PREPARE stmt;

    游标
    从包括多条数据记录的结果集中每次提取一条记录的机制
    游标充当指针的作用。
    一、声明一个游标: declare 游标名称 CURSOR for table;(这里的table可以是你查询出来的任意集合)
    二、打开定义的游标:open 游标名称;
    三、获得下一行数据:FETCH 游标名称 into 列
    四、需要执行的语句(增删改查):这里视具体情况而定
    五、释放游标:CLOSE 游标名称;

    相关文章

      网友评论

          本文标题:mysql异常处理 handler

          本文链接:https://www.haomeiwen.com/subject/cmmhmltx.html