Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104673155
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-24 21:26:04

存储过程中的异常处理
 

没有异常处理
 
create procedure yichang ()
 returning int;
 define var_num integer;
 let  var_num = "jack";
--------存储过程到这将会出错
        return var_num;
end procedure;
 
 
 
 
异常处理
 
create procedure err_deal()
 define sql_err int;
 define isam_err int;
 define error_info char(100);
 on exception set sql_err, isam_err, error_info
  call error_rout(sql_err,isam_err,error_info);
 end exception;
end procedure;
 
 
 

异常捕获:ON EXCEPTION
 
 
用ON EXCEPTION语句捕获一个或一组特定的异常(即错误),用错误号标识。
ON EXCEPTION 语句与RAISE EXCEPTION 语句一起提供存储过程语言(SPL)的错误 捕获和恢复机制。
在一个语句块内可以定义多个 ON EXCEPTION 语句。
被捕获的异常可以是系统异常或用户定义的异常。
一旦异常被捕获,错误状态即被清除。
 
 

ON EXCEPTION 语句的位置:
ON EXCEPTION 语句是一声明性而非执行性语句, 故应位于任何执行语句之前,  而位于DEFINE 语句之后。
 
 
 
 
格式

           ON EXCEPTION IN (错误号,...)
           SET SQL 错误变量 ISAM 错误文本变量   语句块
           END EXCEPTION [WITH RESUME]
 

IN 子句说明欲捕获的错误号, 缺省时捕获所有的错误号。
SET 子句接收错误号和错误文本的变量,该语句可省略。
SQL 错误变量:  说明接收SQL 错误号的变量
ISAM错误变量: 说明接收ISAM错误号的变量
错误文本变量:   说明接收与SQL错误号对应的错误文本的变量
WITH RESUME 关键字用于把控制转向到捕获的错误被处理后的紧接发生异常语句后的语句,其效果相当于异常被处理后程序继续执行下去。  
WITH RESUME 可以省略。
 
 
 

捕捉特定的错误
 
create procedure err_deal()
 define sql_err int;
 define isam_err int;
 define error_info char(100);
 on exception set sql_err, isam_err, error_info
  call error_rout(sql_err,isam_err,error_info);
 end exception;
-----其他错误的捕捉
        on exception (-206)
  call new_tab();
 end exception;
-----表不在数据库中的错误在这里捕捉
end procedure;
 
 
 

异常处理后继续执行
 
        on exception (-206)
  call new_tab();
 end exception with resume;
        select new froom tab;
--出错将继续执行
        let nex=9;
 
 

WITH RESUME将继续
执行出错行后面的语句

如果没有WITH  RESUME将继续执行下一次循环或下一个语句块,如果有的话。如果没有语句块,则过程将结束。
 
 
 

异常捕获:RAISE EXCEPTION

用RAISE EXECPTION 语句模拟异常的产生,该异常可被ON EXECTPION语句捕获。
格式:
      RAISE EXCEPTION SQL 错误号, ISAM 错误号, 错误文本变量
SQL错误号和ISAM错误号均可是SPL表达式,且其计算结果是一个常数(错误号)
例子:
RAISE EXCEPTION -99999, 0, --Broke the Rule 
 
 
 

create procedure err_deal()
 define sql_err int;
 define isam_err int;
 define error_info char(100);
 on exception set sql_err, isam_err, error_info
  call error_rout(sql_err,isam_err,error_info);
                raise exception sql_err, isam_err, error_info;
----------------RAISE EXCEPTION引发一个人工的错误信息
 end exception;
end procedure;
 
 
 
 

存储过程的权限

两类存储过程
DBA 权限的存储过程
所有者权限的存储过程
 
下列用户可以创建存储过程
具有RESOURCE 权限的用户可以创建存储过程

下列用户可以执行存储过程
DBA 用户
存储过程的创建者 
具有EXECUTE 权限的用户
阅读(1365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~