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

 找回密码
 注册
查看: 5052|回复: 4

[每日一题] PL/SQL Challenge 每日一题:2017-5-24 SAVE EXCEPTIONS 和 LOG ERRORS的区别

[复制链接]
论坛徽章:
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-5-31 03:51 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

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

作者:Steven Feuerstein

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

我执行了这些语句:

CREATE TABLE qz_sentients
(
   id   NUMBER PRIMARY KEY,
   nm   VARCHAR2 (15)
)
/

BEGIN
   INSERT INTO qz_sentients VALUES (1, 'Black Bear');
   INSERT INTO qz_sentients VALUES (2, 'Whale');
   INSERT INTO qz_sentients VALUES (3, 'Crow');
   INSERT INTO qz_sentients VALUES (4, 'Dolphin');
   INSERT INTO qz_sentients VALUES (5, 'Bonobo');
   INSERT INTO qz_sentients VALUES (6, 'Chimpanzee');
   INSERT INTO qz_sentients VALUES (7, 'Gorilla');
   INSERT INTO qz_sentients VALUES (8, 'Elephant');
   INSERT INTO qz_sentients VALUES (9, 'Octopus');
   COMMIT;
END;
/

BEGIN
   DBMS_ERRLOG.create_error_log (dml_table_name => 'QZ_SENTIENTS');
END;
/

哪些选项在执行之后会在屏幕上显示 "Kaboom" (可能还有其它文本)?

(A)
DECLARE
   TYPE ids_t IS TABLE OF qz_sentients.id%TYPE;

   l_ids   ids_t := ids_t (2, 6, 9);
BEGIN
   FORALL indx IN 1 .. l_ids.COUNT SAVE EXCEPTIONS
      UPDATE qz_sentients
         SET nm = nm || nm
       WHERE id = l_ids (indx);

   DBMS_OUTPUT.put_line ('Some better than none');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Kaboom! ' || SQL%ROWCOUNT);
END;
/

(B)
DECLARE
   TYPE ids_t IS TABLE OF qz_sentients.id%TYPE;

   l_ids   ids_t := ids_t (2, 6, 9);
BEGIN
   FORALL indx IN 1 .. l_ids.COUNT
      UPDATE qz_sentients
         SET nm = nm || nm
       WHERE id = l_ids (indx);

   DBMS_OUTPUT.put_line ('Some better than none');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Kaboom! ' || SQL%ROWCOUNT);
END;
/


(C)
BEGIN
   UPDATE qz_sentients
      SET nm = nm || nm
    WHERE id IN (2, 6, 9);

   DBMS_OUTPUT.put_line ('Some better than none');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Kaboom! ' || SQL%ROWCOUNT);
END;
/

(D)
BEGIN
   UPDATE qz_sentients
      SET nm = nm || nm
    WHERE id IN (2, 6, 9)
      LOG ERRORS REJECT LIMIT UNLIMITED;

   DBMS_OUTPUT.put_line ('Some better than none');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Kaboom! ' || SQL%ROWCOUNT);
END;
/
论坛徽章:
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-5-31 09:15 来自手机 | 显示全部楼层
D是对的,

使用道具 举报

回复
论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-5-31 10:23 | 显示全部楼层
答案: ABC

A:  nm  定义最大长度 VARCHAR2 (15),两倍长度后, (2, 6, 9) 中 ,6 Chimpanzee 会报例外
      FORALL + SAVE EXCEPTIONS ,例外会在记录都处理完后再报例外,所以会显示 Kaboom! 2

B: 执行到第二行就会报例外 ,所以会显示 Kaboom! 1

C: SQL 执行中报例外,所以会显示 Kaboom! 0

D:  UPDATE 中加了 LOG ERRORS REJECT LIMIT UNLIMITED, 例外的数据行会插入到表 ERR$_QZ_SENTIENTS  中,
     不会报例外,会显示 Some better than none

使用道具 举报

回复
论坛徽章:
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-6-1 05:25 | 显示全部楼层
答案ABC, 3楼得奖。

A: 如果至少有一个语句出错(绑定变量6 - Chimpanzee会出错因为"ChimpanzeeChimpanzee"对nm列来说太长了),那么即使有SAVE EXCEPTIONS,PL/SQL也会抛出-24381异常,显示如下:

Kaboom! 2

B: 在没有SAVE EXCEPTIONS的情况下,一旦有一个语句出错,FORALL语句就会被异常中止,这发生于第二个值(6),所以会显示:

Kaboom! 0

C: 这是一个平白无奇的DML语句(既没有带SAVE EXCEPTIONS的FORALL, 也没有 LOG ERRORS)所以UPDATE会报错,我们会看到:

Kaboom! 0

D: 我用了LOG ERRORS来在行的级别去除错误。LOG ERRORS的工作原理是,当我结束时没有碰到“太多”的错误(其上限在REJECT LIMIT中指定),控制权就会返回给调用的块,并且不会报异常。这个选项会使得下列文本被显示:

Some better than none

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-6-1 15:15 | 显示全部楼层
newkid 发表于 2017-6-1 05:25
答案ABC, 3楼得奖。

A: 如果至少有一个语句出错(绑定变量6 - Chimpanzee会出错因为"ChimpanzeeChimpanz ...

学习了

使用道具 举报

回复

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

本版积分规则

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