PL/SQL Challenge 每日一题:2014-7-31 重新抛出异常

[复制链接]
查看11 | 回复4 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我执行了这些语句:
create table plch_data (
the_key integer,
the_value varchar2(100))
/
begin
insert into plch_data values
(1, 'One');
insert into plch_data values
(2, 'Two');
insert into plch_data values
(2, 'Three');
end;
/
create or replace procedure plch_log_error (
key_in in integer default null)
is
begin
dbms_output.put_line ('Error='||sqlcode);
end plch_log_error;
/
哪些选项可用来取代下列过程中的 ##REPLACE## :
create or replace procedure plch_proc (
key_in in plch_data.the_key%TYPE)
is
l_value plch_data.the_value%TYPE;
begin
select the_value into l_value
from plch_data
where the_key = key_in;
exception
##REPLACE##
end plch_proc;
/
使得下列代码执行之后会显示下方的两行文本:
begin
begin
plch_proc (0);
exception
when others
then
null;
end;
begin
plch_proc (2);
exception
when others
then
null;
end;
end;
/
Error=100
Error=-1422
注意:NO_DATA_FOUND异常返回的SQLCODE是100, TOO_MANY_ROWS异常返回的SQLCODE是-1422
(A)
when no_data_found
then
plch_log_error;
raise no_data_found;
when too_many_rows
then
plch_log_error;
raise too_many_rows;
(B)
when others
then
plch_log_error;
raise;

(C)
when others
then
plch_log_error;
case sqlcode
when 100 then raise no_data_found;
when -1422 then raise too_many_rows;
end case;



回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
ABC
plch_proc会抛出NO_DATA_FOUND、TOO_MANY_ROWS异常,三个选项都可以在plch_proc过程的内部捕获异常、进行输出,然后AC抛出指定异常,而B不论plch_proc过程出现什么异常都进行抛出;由于在主代码块中针对每次执行plch_proc都进行了异常处理,所以plch_proc(0)抛出的异常不会影响plch_proc(2)的执行;
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
这种用法学习了
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案ABC, 2楼得奖。
A: (不推荐)
没必要用两个异常处理器!既然调用的是同一个错误日志过程,参数也一样(都没有参数),你可以仅仅在一个WHEN子句中使用一个RAISE语句。
B: (推荐)
好多了。只要一个WHEN子句, 一个RAISE来处理所有错误,不管是什么异常都重新抛出。
C: (不推荐)
这个选项也能行,但是代码风格可以改善,用一个RAISE语句来取代CASE语句,参见选项B。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
截止到今日每日一题奖励已发~同学们继续努力哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行