-- 异常处理
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 游标名称;
网友评论