当前位置:首页 » 存储配置 » mysql存储过程异常处理

mysql存储过程异常处理

发布时间: 2022-06-30 22:55:59

A. mysql存储过程中如何定义错误处理

declare是用来定义变量和常用处理、声明之类的关键字。在mysql存储过程出现之前declare是一块鸡肋,大家常用declare来定义局部变量,我习惯性的还是使用set来定义变量(虽然是全局的,但是来的方便)。 存储过程出现后declare的标准处理定义就变成了非常强大的工具,可以用来为存储过程添加一些非常强大的错误处理机制。 首先需要提一点的是declare定义变量如果想定义varchar型的,必须注明参数最大长度,即declare varchar(20). 在这里我们不深究它用来定义参数的小细节 我们主要来研究DECLARE Condition 和 DECLARE Handler DECLARE Condition 和 DECLARE Handler可以说是为了处理错误而生的。 功能上讲DECLARE Condition出现的时间比较早,功能也比较简单,它可以通过错误编号或者SQLSTATE来触发一各名字,说明白一点就是当某个错误编号出现的时候替换一个名字给它。这样调用的时候,我们不用去记一大串错误编号了。 它的标准语法我们可以在mysql的附注中找到。 DECLARE condition_name CONDITION FOR condition_value condition_value:例子如下:DECLARE errname CONDITION FOR SQLSTATE '23000' 将返回SQLSTATE信息为23000的错误定名为errname 这个名字就可以被我们的绝对重头戏DECLARE Handler调用了,在DECLARE Handler中可以定义错误的处理办法,可以使用begin和end来标记语句块,可以单独使用rollback。处理的过程也可以定义为继续执行和中断存储过程。 标准语法:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: 处理的过程。 CONTINUE 继续执行未完成的存储过程,直至结束。(常用,默认) | EXIT 出现错误即自动跳出所在的begin不再执行后面的语句。 condition_value: 处理的触发条件 SQLSTATE [VALUE] sqlstate_value 不用说了,最常用的错误定义,自己去查错误列表吧。 | condition_name 我们刚刚定义的那个名字errnmae就是用在这里的。 | SQLWARNING 这个太好用了,从错误编号01开始的错误。相当于错误的通配符。 | NOT FOUND 和上面差不多,从02开始。 | SQLEXCEPTION 上面两个中没有包括的错误它都可以用来触发,就是说你想定义只要出错就触发的话就定义出错条件为SQLWARNING+SQLEXCEPTION。 | mysql_error_code 错误编号,和第一个不一样,不过同样可以在错误列表从中查到,是我比较常用的。 例子DECLARE errname CONDITION FOR SQLSTATE '23000'; 给导致错误23000的错误定义名字为errname DECLARE continue handler for errname 当errname发生时作下面的处理 BEGIN 语句开始 set @x=1; 设置@x=1

B. MYSQL 存储过程 中怎么捕获异常

DECLARE处理程序的使用:

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

其中,

handler_type的取值范围:CONTINUE | EXIT | UNDO

condition_value的取值范围:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。

· SQLWARNING是对所有以01开头的SQLSTATE代码的速记。

· NOT FOUND是对所有以02开头的SQLSTATE代码的速记。

· SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。

注:除了SQLSTATE值,MySQL错误代码也不被支持。


例:

[sql]viewplainprint?
delimiter$$

CREATETABLE`_t1`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`val1`varchar(20)DEFAULTNULL,
`val2`int(11)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=113DEFAULTCHARSET=latin1$$
[sql]viewplainprint?
DELIMITER$$

CREATEDEFINER=`abandonship`@`%`PROCEDURE`P_TestException`()
BEGIN
declare_var,_errintdefault0;
,sqlwarning,notfoundset_err=1;
insertinto_t1(val1,val2)value(2012,'abandonship');
if_err=1then
set_var=2;
endif;

selectcasewhen_var=2then'出错了'else_varend;

调用该存储过程将返回:出错了

C. mysql 存储过程 异常 是否自动 回滚

是滴,默认是隐式的开始与提交,出现异常会默认自动回滚到开始位置,任何一个使用JDBC操作数据库的SQL命令,在默认情况下,隐式开始与提交事务。当显示的调用事物时,就必须显示使用commit当使用rollback后也要进行commit;

D. mysql存储过程执行一半出现异常会怎么办

如果在存储过程调用的时候显式的调用了事务处理,那么,会回滚,否则执行到那里就在哪里生效。

E. mysql存储过程出错

mysql> create PROCEDURE sp_GetPageRecord( IN TableName VARCHAR(100), IN Primar
yKey VARCHAR(50), IN Col1 VARCHAR(255) , IN WhereSql VARCHAR(255) , IN Sort V
ARCHAR(200) , IN PageSize INT , IN CurrPage INT, IN IsDesc BIT(1) ) BEGIN END;
Query OK, 0 rows affected (0.00 sec)

当然首先要确认下MySQL版本。MySQL从5.0版本开始支持存储过程
一、VARCHAR类型最多支持255个字符,超过255个字符可以考虑用TEXT变量。TEXT变量支持最大到65536个字节。
二、不支持参数中的DEFAULT值。也就是说 = ...这样的要去掉。
三、必须要有过程体,过程体的开始与结束使用BEGIN与END进行标识。
四、BIT类型支持1-64位的存储。
五、存储过程中SELECT ... INTO var_list中var_list不能用存储过程的参数。
六、下面需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
七、存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回

在mysql命令提示符下逐行输入下面的语句。
delimiter //
create procere `demo_out_total`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT
total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE v_sql VARCHAR(500);
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set v_sql = CONCAT('select count(*) into @total from ',tbl_name, ' where ',whereClause, '
;');
select v_sql;
SET @total = 0;
SET @v_sql = v_sql;
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;
select @total;
set total_tbl = @total;
END;
//

/* sp demo_out_total2 use curson */
create procere `demo_out_total2`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE c_total CURSOR for SELECT total from tmptable ;
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set @v_sql = 'drop table tmptable if exist tmptable;';
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

set @v_sql = CONCAT('create table tmptable as select count(*) total from ',tbl_name,' where ',whereClause,';');
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

OPEN c_total;
FETCH c_total INTO total_tbl;
CLOSE c_total;
END;
//
delimiter ;

set @tbl_name = 'tb2';
set @whereClause = 'tid= 237';
set @total_tbl = 0;
call demo_out_total(@tbl_name,@whereClause,@total_tbl);
select @total_tbl;

详见MySQL存储过程详解:
http://wenku..com/link?url=_W2ft5HNybWw5fBTPIFWEx--gAbNvgADf0wGk0s43QSoA2_Ci3ztQOKdO25uS85BJSdHK

MySQL存储程序入门指南:
http://www.cnblogs.com/wxb-km/archive/2012/11/18/2775780.html

MySQL create procere语句参考:
http://dev.mysql.com/doc/refman/5.6/en/create-procere.html
http://dev.mysql.com/doc/refman/5.6/en/cursors.html
http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

MySQL数据类型存储要求:
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

F. mysql的一个存储过程,一直报错,缺没发现错误在哪求指点!

可以运行的,你把char类型加个整数1,类型转换错误,就报异常了,存储过程字符用varchar类型的比较多一些。

G. mysql 存储过程出现死锁

产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。

热点内容
服务器怎么做双机 发布:2024-05-07 02:37:25 浏览:35
ftp剪切 发布:2024-05-07 02:37:14 浏览:138
手机存储英文 发布:2024-05-07 02:34:31 浏览:640
php锁变量 发布:2024-05-07 02:09:02 浏览:48
股票涨的算法 发布:2024-05-07 01:59:22 浏览:23
安卓手机如何关闭英文拼写 发布:2024-05-07 01:45:46 浏览:297
光介质存储 发布:2024-05-07 01:32:25 浏览:351
苹果平板ipad密码忘了怎么办 发布:2024-05-07 01:17:16 浏览:704
伏吟的算法 发布:2024-05-07 00:51:48 浏览:830
安卓手机上的照相键在哪里 发布:2024-05-07 00:51:45 浏览:606