oralce学习笔记之异常处理篇

oracle的异常分为编译时异常(错误)和运行时异常,前者不能被处理,后者可以被处理。
我们主要讨论运行时异常。

异常类型:
a、预定义异常
      已命名的预定义异常有CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS等
b、用户定义异常
c、已命名异常(已命名异常不能单独归为一类异常,但它有点特别,所以我将它单独罗列说明)
      如果希望处理一个异常(被when子串处理),那么异常必须有一个名字,如TOO_MANY_ROWS;
      数据库错误有数千个,但是只有不到25个是内建的已命名异常(这些异常都声明在standard包中);
      要处理那些未命名的异常时,你可以将一个名字和一个错误号联系在一起,达到这个目的的语句是pragma exception_init语句;

抛出异常:
a、通过pl/sql运行时引擎
      当数据库或pl/sql在运行时发生错误时,一个异常被pl/sql运行时引擎自动抛出
b、使用raise语句
      异常也可以通过raise语句抛出:raise exception_name;
c、调用raise_application_error存储过程

处理异常&异常传播:
a、一旦程序进入异常部分就不能再回到同一块的执行部分;当异常被处理后,控制返回到外层执行部分的下一条语句;
b、如果有when others子串,则必须放置在最后面作为缺省处理器处理没有显式处理的异常;
c、执行部分抛出的异常将首先传递到同一块的异常部分,如果在同一块的异常部分没有处理这个异常的处理器,那么异常将会传播到上一层的异常部分中,一直到最外层;
d、异常被处理后如果你仍然希望它继续传播,可以在异常处理的最后执行不带参数的raise语句(raise语句将重新抛出出现的异常,允许它继续传播);

--这是一个上面部分知识点的示例(伪代码)说明
declare
  ...
  user_define_exception exception; --用户定义异常
  invalid_column_name exception; 
  --补充说明:如果我们在程序块中使用了无效列名,会有括号中的错误提示(ORA-00904:invalid column name)
  --下面我们将这个异常代码号与我们自定义的异常进行关联,即为异常命名
  pragma exception_init(invalid_column_name,-904); 
begin
  ...
  --raise user_define_exception; --可以显式引发异常
exception
  when TOO_MANY_ROWS then  --预定义异常处理
    ...;
  when user_define_exception then --用户定义异常处理
    ...;
  when invalid_column_name then  --PRAGMA EXCEPTION_INIT异常处理
    ...;
    raise;    --继续传播该异常
end;

sqlcode和sqlerrm:
a、另外一种处理数据库错误的方法是使用内建函数sqlcode和sqlerrm;
b、sqlcode将返回现行数据库错误号,这些错误号中除了no_data_found是+100外其他都是负数;
c、sqlerrm返回文本描述的错误信息;
d、为了获得用户自定义异常返回的sqlerrm和sqlcode,你需要使用raise_application_error函数给自定义异常标注错误号

给自定义错误标注号码:
a、raise_application_error内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息;
b、自定义异常的缺省错误号是+1,缺省信息是user_defined_exception。来自未处理的异常的一般信息对于识别导致错误的原因没有帮助,
c、raise_application_error函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常;
d、使用语法:raise_application_error(error_no,error_message[,{true|| false}]);
e、错误号的范围是-20,001到-20,999;错误信息是文本字符串,最多为2048字节;true和false表示是添加(true)进错误堆(error stack)还是覆盖(overwrite)错误堆(false)。缺省情况下是false。

参考资料:
《oracle编程入门经典》
http://www.daima.com.cn/Info/69/Info27315/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误通常是因为在代码中使用了数字常量作为标识符,而不是使用合法的标识符。标识符是用来标识变量、函数、类等程序实体的名称,必须以字母、下划线或美元符号开头,后面可以跟字母、数字、下划线或美元符号。如果使用数字常量作为标识符,编译器就会报出这个错误。解决方法是修改代码,使用合法的标识符。 ### 回答2: 这个错误常出现在程序中使用数字来命名变量或函数时。在C++中,标识符的命名必须以字母,下划线或美元符号开始,并且后续字符必须为字母,数字,下划线或美元符号。如果以数字开头,则会报出“expected identifier before numeric constant错误。 例如,以下的代码会出现这个错误: ``` int 123number = 10; ``` 这个代码试图定义一个名为“123number”的整型变量并将其初始化为10,但由于它以数字开头,编译器将无法识别它,并报出该错误信息。 要避免此错误,应该始终使用字母,下划线或美元符号作为标识符的开头,如下所示: ``` int number123 = 10; ``` 在这个例子中,我们将变量名修改为“number123”,并且不再会出现该错误。因此,在编写程序时,请记得始终使用适当的命名规则来避免这个错误。 ### 回答3: 这个错误信息通常是由于代码中使用了数值常量作为标识符(identifier)而导致的。 在编写代码时,标识符是用于标识变量、函数、类等命名实体的名称。标识符必须符合一定的命名规则,例如不能以数字开头。然而,当我们在代码中使用了数值常量作为标识符时,编译器就会报出“expected identifier before numeric constant”这样的错误信息。 比如,下面的代码就会出现这个错误: int 123 = 10; 在这段代码中,我们尝试将一个整型变量的标识符命名为123,但是这显然是不合法的,因为标识符不能以数字开头。因此,编译器会提示我们“expected identifier before numeric constant”的错误信息。 同样的,如果我们在函数名或者类名中使用数值常量作为标识符,也会出现相同的错误。 总之,避免在代码中使用数值常量作为标识符是一个良好的编程习惯,这样不仅可以避免编译错误,还可以提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值