zoukankan      html  css  js  c++  java
  • mysql存储过程获取sqlstate message_text

    群里有人询问,在mysql的proc中如何获取错误信息、错误编号呢?我们知道在oracle、mssql中比较简单;

    oracle中sqlcode,sqlerrm ;mssql中ERROR_PROCEDURE(), ERROR_MESSAGE();
    那么在mysql中呢?
    下面给出示例:
    mysql> show create procedure proc_6G
    *************************** 1. row ***************************
               Procedure: proc_6
                sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
        Create Procedure: CREATE DEFINER=`root`@`192.168.6.%` PROCEDURE `proc_6`()
        LANGUAGE SQL
    begin
    DECLARE code CHAR(5) DEFAULT '00000';
    DECLARE msg TEXT;
    declare pout double;
     
    DECLARE continue HANDLER FOR SQLEXCEPTION
        BEGIN
          GET DIAGNOSTICS CONDITION 1 --通过GET DIAGNOSTICS这样的方式获取sqlstate message_text(当然错误信息错误编号可以自己定义)
    --参考我的另外一个示例
    ------------------------------
    drop FUNCTION if exists test.fn_get_random_str;
     
    create function fn_get_random_str(f_len int)
    returns varchar(4000)
    no sql 
    begin 
      declare v_str varchar(52);
      declare v_cnt int;
      declare f_result varchar(4000);
      /*自定义异常编码40001:value_to_large*/
      declare value_to_large condition for sqlstate '40001';
      
      if f_len>4000 then 
        begin 
          signal sqlstate '40001'
          set message_text='value_to_large';/*输出错误信息40001:value_to_large*/
        end ;
      end if ;
      
      set v_str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
      set v_cnt=1;
      set f_result='';
      
      while v_cnt<=f_len do
        set f_result=concat(substr(v_str,round(rand()*52,0),1),f_result);
        set v_cnt=v_cnt+1;
      end while ;
      
      return f_result ;
      
    end ;
     
    mysql> select fn_get_random_str(5000);
    ERROR 1644 (40001): value_to_large
    ------------------------------
            code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
        END;
    /*set pout= 1/0;*/
    select 1/0 into pout from test.ttt ;  --模拟了一个不存在的表错误
    select concat(code,msg) ;
    end
    character_set_client: utf8
    collation_connection: utf8_general_ci
      Database Collation: latin1_swedish_ci
    1 row in set (0.28 sec)
     
    mysql> call test.proc_6();
    +-------------------------------------+
    | concat(code,msg)                    |
    +-------------------------------------+
    | 42S02Table 'test.ttt' doesn't exist |  --看到了吧错误信息打印出来了
    +-------------------------------------+
    1 row in set (0.99 sec)
     
    Query OK, 0 rows affected (0.99 sec)
    咋样满足需求了吧!
  • 相关阅读:
    《Django By Example》第十二章(终章) 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第八章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
    我的superui开源后台bootstrap开发框架
    LayoutInflater 总结
    Android屏幕分辨率概念(dp、dip、dpi、sp、px)
    android studio安装问题
  • 原文地址:https://www.cnblogs.com/duanxz/p/3566263.html
Copyright © 2011-2022 走看看