存储过程异常
① oracle存储过程中 未找到数据 异常的问题。。。
解决这个办法很多,按提问者的意思,异常肯定是no
data
found,这个时候你需要检查在哪出现的这个异常,如果数据不多的话,你可以用一条一条记录的去试,如果数据量大的话那直接在每个select前先选出count(*)
into
counts,当
counts<>
0的时候再让它执行下边的语句,或者直接存储工程中加异常处理的语句,我一般遇到这种情况都是用第一种,很简单但是很实用,屡试不爽。哈哈,如果有机会再交流交流
② mysql存储过程执行一半出现异常会怎么办
如果在存储过程调用的时候显式的调用了事务处理,那么,会回滚,否则执行到那里就在哪里生效。
③ 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;
调用该存储过程将返回:出错了
④ 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;
⑤ mysql 存储过程 异常 是否自动 回滚
是滴,默认是隐式的开始与提交,出现异常会默认自动回滚到开始位置,任何一个使用JDBC操作数据库的SQL命令,在默认情况下,隐式开始与提交事务。当显示的调用事物时,就必须显示使用commit当使用rollback后也要进行commit;