ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 15414|回复: 6

[每日一题] PL/SQL Challenge 每日一题:2017-3-13 异常处理

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-3-16 05:00 | 显示全部楼层 |阅读模式

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

每两周的优胜者可获得itpub奖励的技术图书一本。

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

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

作者:Steven Feuerstein

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

我创建了下列的表:

CREATE TABLE plch_parts
(
   partnum    INTEGER PRIMARY KEY
, partname   VARCHAR2 (100) UNIQUE
)
/

BEGIN
   INSERT INTO plch_parts
        VALUES (1, 'Mouse');

   INSERT INTO plch_parts
        VALUES (100, 'Keyboard');

   INSERT INTO plch_parts
        VALUES (500, 'Monitor');

   COMMIT;
END;
/

哪些选项包含的PL/SQL块在执行之后屏幕上会显示 "HANDLED"?

(A)
BEGIN
   BEGIN
      INSERT INTO plch_parts
           VALUES (2, 'Mouse');
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         DBMS_OUTPUT.put_line ('HANDLED');
   END;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('NOT HANDLED');
END;
/

(B)
BEGIN
   BEGIN
      INSERT INTO plch_parts
           VALUES (2, 'Mouse');
   EXCEPTION
      WHEN -1
      THEN
         DBMS_OUTPUT.put_line ('HANDLED');
   END;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('NOT HANDLED');
END;
/

(C)
BEGIN
   BEGIN
      INSERT INTO plch_parts
           VALUES (2, 'Mouse');
   EXCEPTION
      WHEN 'ORA-00001'
      THEN
         DBMS_OUTPUT.put_line ('HANDLED');
   END;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('NOT HANDLED');
END;
/

(D)
BEGIN
   BEGIN
      INSERT INTO plch_parts
           VALUES (2, 'Mouse');
   EXCEPTION
      WHEN OTHERS
      THEN
         IF SQLCODE = -1
         THEN
            DBMS_OUTPUT.put_line ('HANDLED');
         ELSE
            RAISE;
         END IF;
   END;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('NOT HANDLED');
END;
/

论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
发表于 2017-3-16 08:39 | 显示全部楼层
B.D,感觉是。
来自安卓客户端来自客户端

使用道具 举报

回复
论坛徽章:
44
处女座
日期:2016-06-02 13:45:22马上有房
日期:2014-10-17 13:54:18阿斯顿马丁
日期:2014-01-06 13:43:47复活蛋
日期:2013-05-30 16:44:312013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-02-08 09:53:14ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:花样游泳
日期:2012-08-16 09:53:31迷宫蛋
日期:2013-05-10 18:23:20ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2017-3-16 09:21 来自手机 | 显示全部楼层
应该是A,D

使用道具 举报

回复
认证徽章
论坛徽章:
8
弗兰奇
日期:2016-10-24 16:19:30奥运会纪念徽章:体操
日期:2016-08-29 16:30:33蒙奇·D·路飞
日期:2017-03-15 08:47:45娜美
日期:2017-03-15 11:32:24ITPUB15周年纪念
日期:2017-03-20 14:47:54秀才
日期:2017-04-05 13:22:59秀才
日期:2017-04-05 13:23:20ITPUB15周年纪念
日期:2017-04-11 10:51:30
发表于 2017-3-16 10:48 | 显示全部楼层
A,D

partname字段上有唯一性性约束,并且已插入值 Mouse

A选项   插入值带有Mouse 违反唯一性约束,DUP_VAL_ON_INDEX 捕获违法唯一性的异常  
D选项  插入值带有Mouse 违反唯一性约束,sql执行失败,sqlcode=-1

使用道具 举报

回复
求职 : 数据分析/ETL
论坛徽章:
8
鲜花蛋
日期:2014-08-09 15:15:33itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-05 13:22:59火眼金睛
日期:2017-11-01 17:00:02火眼金睛
日期:2017-11-30 22:00:00
发表于 2017-3-16 16:32 | 显示全部楼层
AD 有异常而且捕获
BC when的判断条件有误,后面应该跟异常而不是数字和字符串

使用道具 举报

回复
论坛徽章:
0
发表于 2017-3-16 17:02 | 显示全部楼层
本帖最后由 happy6310 于 2017-3-16 17:07 编辑
恨别 发表于 2017-3-16 10:48
A,D

partname字段上有唯一性性约束,并且已插入值 Mouse

  好清晰   ,把B和C一起分析一下

捕获信息:DUP_VAL_ON_INDEX 或 others

B选项   插入值带有Mouse 违反唯一性约束,内层exception捕获不到相应的异常跳出外层exception ,输出 NOT HANDLED
C选项   插入值带有Mouse 违反唯一性约束,内层exception捕获不到相应的异常跳出外层exception ,输出 NOT HANDLED


使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
 楼主| 发表于 2017-3-17 03:51 | 显示全部楼层
答案AD, 4楼得奖。

A: 插入会报  ORA-00001 或者 DUP_VAL_ON_INDEX错误,因为表中已经存在一行 partname 为"Mouse"的数据。内层的异常处理器通过名字(顺便提一下,这个名字是在STANDARD包中定义的)捕获了这个异常,"HANDLED"被显示。
B: 这个块会报错:
"PLS-00103: Encountered the symbol "-" when expecting one of the following:..."
你不能在异常处理的WHEN子句使用字面常量,不管是数值还是字符串。

C: 这个块会报错:
"PLS-00103: Encountered the symbol "ORA-00001" when expecting one of the following:..."
你不能在异常处理的WHEN子句使用字面常量,不管是数值还是字符串。

D: 插入会报  ORA-00001 或者 DUP_VAL_ON_INDEX错误,因为表中已经存在一行 partname 为"Mouse"的数据。内层的异常处理器含有WHEN OTHERS 子句,它捕获了内层块抛出的任何异常。然后它又执行了一个IF语句来查看抛出的错误是否DUP_VAL_ON_INDEX(其错误代码为-1)。确实是,所以"HANDLED"被显示。

使用道具 举报

回复

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

本版积分规则

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