当前位置:首页 » 服务存储 » 存储过程异常处理
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

存储过程异常处理

发布时间: 2022-02-07 01:52:12

‘壹’ 如何在sql存储过程中处理错误

1. 建立一个过程,第一个语句 DECLARE EXIT HANDLER是用来处理异常的,意思是如果错误 1216发生,这个程序将会在错误记录表中插入一行,
EXIT的意思是 当动作成功提交后推出这个复合语句。
create procere p22(parameter int)
begin
declare exit Handler for 1452
insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));
insert into t3 values(parameter);
end;//
2. 申明异常处理的语法 DECLARE HANDLER syntax:
DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement
上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码,MYSQL允许两种处理器,一种是exit处理,另外一种是 continue处理,与exit
不同的是在于他执行后,原主程序仍然继续运行,那么该复合语句就没有出口了。
----continue处理的例子:
create table t4(s1 int primary key);//
create procere 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;
select @x, @x2;
end;//
call p23();//
---- rollback(回滚事务),定义自己的错误处理名字 declare '错误处理名' condition for SQLSTATE'23000';
create procere p24()
begin
declare ViolationSelf condition for SQLSTATE'23000';
DECLARE EXIT HANDLER for ViolationSelf rollback;
start transaction;
insert into t2 values(1);
insert into t2 values(1);
commit;
end;//

/******************************************** Cursor游标 **********************************************************/
游标实现功能的摘要: 声明游标, 打开游标,从游标里读取,关闭游标
DECLARE cursor-name CURSOR FOR SELECT ······
OPEN cursor-name;
FETCH cursor-name INTO variable;
CLOSE cursor-name;
1. create procere p25(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
repeat
fetch cur_1 into a;
until b=1
end repeat;
close cur_1;
set return_val=a;
end;//
2. create procere p25_1(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
lable_1:loop
fetch cur_1 into a;
if b=1 then
leave lable_1;
end if;
set c=c+1;
end loop;
close cur_1;
set return_val=c;
end;//
create procere p34(in va int)
begin
delete from t where s1=va;
end;//

‘贰’ 存储过程触发异常后可不可以继续执行

把可能抛出异常的部分另外写一个单独的过程。
并且是具备异常处理能力的,如果你不想作什么处理,可以在when others then下面写一个null;就可以了。
这样异常发生时,在本过程内就处理掉了,异常没有被传播(就是抛到调用者那里)。

‘叁’ 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

‘肆’ oracle 存储过程中出现异常的处理

异常是执行这个存储过程出的异常吧,那就是说只有执行一次这个存储过程才会抛一次异常么?如果这样我建议你可以再写个存储过程来调用你这个存储过程,这样来记录异常的次数。然后再进行处理!

‘伍’ oracle存储过程,怎么控制是否做异常处理。

动态sql可以做吧。
exception外面参数判断,走不走exception在动态sql里做。
另外我想问下,exception不是会导致程序中断退出吗?为什么不在exception里做参数判断呢?当不需要走exception的时候,将异常处理设置为 null;,需要的话就走异常处理。

‘陆’ 请教各位高手 oracle 存储过程 如何获得 捕获异常的内容

--通过sqlcode , sqlerrm 这两个内置变量来查看,例如:

DECLARE
--声明异常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition

v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN
--...
--抛出异常
IF ( ... ) THEN --(括号内填抛出异常的条件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉异常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他异常,并获得 捕获异常的内容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.

dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/

/**
sqlcode 就是错误代码
sqlerrm 就是sql错误信息。注意用substr来截取,否则输出很难看。

**/

‘柒’ db2的过程中怎样写异常处理

CREATEPROCEDUREschema_name.proc_name
(
INparm1INTEGER,OUTparm2VARCHAR(1000)
)
SPECIFICPROC_YYZY_XYKCJZ
LANGUAGESQL
NOTDETERMINISTIC
NOEXTERNALACTION
MODIFIESSQLDATA
CALLEDONNULLINPUT
LB_MAIN:BEGINATOMIC
/*DECLARESYSTEMVARIABLES*/
DECLARESQLSTATECHAR(5);
DECLARESQLCODEINTEGER;
DECLAREV_SQLSTATECHAR(5);
DECLAREI_SQLCODEINTEGER;
DECLARESQL_CUR_AT_ENDINTEGER;
DECLARESQL_STMTVARCHAR(2000);
/*DECLAREUSER-DEFINEDVARIABLES*/
--DECLAREV_SEPARATORVARCHAR(50)DEFAULT',';
/*DECLARESTATICCURSOR*/
--DECLAREC1CURSOR/*WITHRETURN*/FOR
--SELECTcolumn1,column2...
--FROMtable_name
--ORDERBYcolumn1,column2...
--;
/*DECLAREDYNAMICCURSOR*/
--DECLAREC2CURSORFORS2;
/*DECLAREEXCEPTIONHANDLE*/
--异常声明
BEGIN
VALUES(SQLCODE,SQLSTATE)INTOI_SQLCODE,V_SQLSTATE;
SETparm2=VALUE(parm2,'')
||'SYSTEM:SQLCODE='||RTRIM(CHAR(I_SQLCODE))
||',SQLSTATE='||VALUE(RTRIM(V_SQLSTATE),'')||';'
;
END;
_CUR_AT_END=1;
/*DECLARETEMPORARYTABLE*/
--
--(
--columnINTEGER
--);

/*SQLPROCEDUREBODY*/

ENDLB_MAIN;

上面的是我常用的一个存储过程的代码样本



异常处理需要加在游标声明之后,临时表声明之前(见DECLARE UNDO HANDLER FOR SQLEXCEPTION部分)



常用的异常处理方式分为三种:UNDO(回滚)、EXIT(退出)、CONTINUE(继续执行)

DECLAREUNDO|EXIT|CONTINUEHANDLERFOR



异常处理的对象可以为针对指定的sqlstate代码

DECLAREUNDO|EXIT|

也可以针对某些condition,如sql异常,sql警告,以及游标末尾

DECLAREUNDO|EXIT||SQLWARNING|NOTFOUND




异常处理的内容 ,可以是一些回滚,提交语句,也可以是日志记录等

DECLAREUNDO|EXIT|
BEGIN
--异常处理内容
END;



引用资料:http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004239.html

‘捌’ oracle 存储过程异常处理

先建一个错误跟踪表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在过程的例外里向跟踪表写入错误信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--记录错误信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,‘day_task’);
end;

‘玖’ 怎样判断存储过程出错并捕捉错误信息

--通过sqlcode , sqlerrm 这两个内置变量来查看,例如:

DECLARE
--声明异常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition

v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN
--...
--抛出异常
IF ( ... ) THEN --(括号内填抛出异常的条件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉异常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他异常,并获得 捕获异常的内容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.

dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/

/**
sqlcode 就是错误代码
sqlerrm 就是sql错误信息。注意用substr来截取,否则输出很难看。

**/

‘拾’ 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;

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