查看: 13346|回复: 7

[每日一题] PL/SQL Challenge 每日一题:2014-3-5 在声明部分抛出的异常

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
跳转到指定楼层
1#
发表于 2014-3-7 04:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

哪些选项创建了一个名为PLCH_FUNC的函数,使得这个代码执行之后:

DECLARE
   l_value   VARCHAR2 (30) := 'This is your brain on music';
BEGIN
   DBMS_OUTPUT.put_line (plch_func (l_value));
END;
/

会显示"This is your brain on music" ?


(A)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
   l_return   VARCHAR2 (10) := UPPER (value_in);
BEGIN
   RETURN l_return;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN value_in;
END;
/

(B)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
   l_return   VARCHAR2 (10);
BEGIN
   l_return := UPPER (value_in);
   RETURN l_return;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN value_in;
END;
/

(C)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
BEGIN
   IF LENGTH (value_in) > 10
   THEN
      RETURN value_in;
   ELSE
      RETURN UPPER (value_in);
   END IF;
END;
/

(D)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
   l_return   VARCHAR2 (10);

   PROCEDURE initialize
   IS
   BEGIN
      l_return := UPPER (value_in);
   END;
BEGIN
   initialize;
   RETURN l_return;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN value_in;
END;
/

(E)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
   l_return   VARCHAR2 (10);

   PROCEDURE initialize
   IS
   BEGIN
      l_return := UPPER (value_in);
   END;
BEGIN
   RETURN l_return;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN value_in;
END;
/

(F)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
BEGIN
   DECLARE
      l_return   VARCHAR2 (10) := UPPER (value_in);
   BEGIN
      RETURN l_return;
   END;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN value_in;
END;
/

(G)
CREATE OR REPLACE FUNCTION plch_func (value_in IN VARCHAR2)
   RETURN VARCHAR2
IS
BEGIN
   DECLARE
      l_return   VARCHAR2 (10) := UPPER (value_in);
   BEGIN
      RETURN l_return;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN value_in;
   END;
END;
/

论坛徽章:
24
路虎
日期:2015-04-14 15:21:15兰博基尼
日期:2015-03-25 16:53:53暖羊羊
日期:2015-06-09 16:42:10美羊羊
日期:2015-05-19 08:24:58美羊羊
日期:2015-05-19 08:25:32慢羊羊
日期:2015-06-01 08:17:54
2#
发表于 2014-3-7 08:41 | 只看该作者
A  错误。由于l_return长度为10,会抛出character string buffer too small的异常,因为在声明块中,因此不会被EXCEPTION捕获。
B  正确。抛出异常的语句为l_return := UPPER (value_in),可以被EXCEPTION捕获,返回value_in
C  正确。判断LENGTH(value_in)>10,因此直接返回value_in
D  正确。在执行initialize中的l_return := UPPER (value_in)时抛出异常,但是可以被EXCEPTION捕获,返回value_in
E  错误。l_return没有在函数中赋值,返回默认值null。
F  正确。与A不同的是将声明语句包含在BEGIN语句块中,可以被EXCEPTION捕获。
G  错误。仍然会抛出character string buffer too small的异常,原因是在声明语句的BEGIN块中没有EXCEPTION。
因此,答案为B C D F

使用道具 举报

回复
论坛徽章:
8
CTO参与奖
日期:2009-01-15 11:42:46SQL大赛参与纪念
日期:2011-04-13 12:08:17蛋疼蛋
日期:2012-05-31 13:19:132013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-03-13 06:00:16目光如炬
日期:2016-07-31 22:30:25火眼金睛
日期:2016-08-31 22:00:00授权会员
日期:2017-09-30 15:12:14
3#
发表于 2014-3-7 11:59 | 只看该作者
lee253654522 发表于 2014-3-7 08:41
A  错误。由于l_return长度为10,会抛出character string buffer too small的异常,因为在声明块中,因此不 ...

厉害

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
4#
 楼主| 发表于 2014-3-8 04:49 | 只看该作者
答案BCDF, 2楼得奖。

A: 这个选项在声明部分对字符串赋值,但是本地变量太小了,所以异常未经处理被传播到函数外面,没有任何东西被显示。
B: 我将赋值转移到执行部分,所以错误被抛出(因为本地变量太小),然后被WHEN OTHERS捕获并处理。
C: (不推荐)
这样也行——它显式地检查输入字符串的长度来查看是否太大。但这不是最好的方法。让PL/SQL的异常处理这种事。
D: (推荐)
我将赋值转移到执行部分——看起来是这样。我创建了一个内嵌过程来包含所有初始化相关的代码(此处仅有一个赋值语句),所以错误被抛出(因为本地变量太小),然后被WHEN OTHERS捕获并处理。
E: 写在这里是为了提醒你这是一个常见错误(至少发生在我身上是常见的)将代码转移到一个内嵌子程序之后忘记调用了!
这个版本永远返回NULL。
F: 在这个选项中我试图在声明部分进行赋值,但它是处于一个内嵌的块中,所以外层的块能够捕获并处理异常。
G: 在这个选项中错误发生在嵌套块的声明部分,而且异常处理器也附在这个内嵌块,而不是外层的块。结果,异常未经处理就离开了外层块。

使用道具 举报

回复
论坛徽章:
24
路虎
日期:2015-04-14 15:21:15兰博基尼
日期:2015-03-25 16:53:53暖羊羊
日期:2015-06-09 16:42:10美羊羊
日期:2015-05-19 08:24:58美羊羊
日期:2015-05-19 08:25:32慢羊羊
日期:2015-06-01 08:17:54
5#
发表于 2014-3-8 14:56 | 只看该作者
newkid 发表于 2014-3-8 04:49
答案BCDF, 2楼得奖。

A: 这个选项在声明部分对字符串赋值,但是本地变量太小了,所以异常未经处理被传播 ...

D里面的内嵌过程不太明白,有何作用,是否可以帮忙解答一下?

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
6#
发表于 2014-3-9 14:48 | 只看该作者
lee253654522 发表于 2014-3-8 14:56
D里面的内嵌过程不太明白,有何作用,是否可以帮忙解答一下?

其实就是个嵌套函数,你类比包头和包体的结构,试想包头和包体如果写在一起会是什么样,就会明白了

使用道具 举报

回复
论坛徽章:
24
路虎
日期:2015-04-14 15:21:15兰博基尼
日期:2015-03-25 16:53:53暖羊羊
日期:2015-06-09 16:42:10美羊羊
日期:2015-05-19 08:24:58美羊羊
日期:2015-05-19 08:25:32慢羊羊
日期:2015-06-01 08:17:54
7#
发表于 2014-3-10 09:40 | 只看该作者
lastwinner 发表于 2014-3-9 14:48
其实就是个嵌套函数,你类比包头和包体的结构,试想包头和包体如果写在一起会是什么样,就会明白了

我自己写了几个例子学习了一下,好像有点明白了,谢谢!

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2014-3-17 16:12 | 只看该作者
似懂非懂 还要努力

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表