查看: 388|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2018-11-6 集合元素的删除

[复制链接]
论坛徽章:
533
奥运会纪念徽章:垒球
日期: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
发表于 2018-11-9 03:53 | 显示全部楼层 |阅读模式
(原发表于 2011-11-11)


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

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

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

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

作者:Steven Feuerstein

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


我创建了一个嵌套表类型和过程:

CREATE OR REPLACE TYPE plch_numbers_t IS TABLE OF NUMBER;
/

CREATE OR REPLACE PROCEDURE plch_show_numbers (
   title_in     IN VARCHAR2
, numbers_in   IN plch_numbers_t)
IS
BEGIN
   DBMS_OUTPUT.put_line (title_in);

   FOR rec IN (SELECT COLUMN_VALUE FROM TABLE (numbers_in))
   LOOP
      DBMS_OUTPUT.put_line (rec.COLUMN_VALUE);
   END LOOP;
END;
/

下面的选项用来代替下列代码块的 /*BODY*/ 注释:
DECLARE
   l_numbers   plch_numbers_t
       := plch_numbers_t (12, 23, 34, 45, 56
                        , 67, 78, 89, 90, 100);
BEGIN
   /*BODY*/

   plch_show_numbers ('AFTER DELETE', l_numbers);
END;
/

哪些选项使得这个块执行之后会显示如下文本:
AFTER DELETE
23
45
67
89

换而言之,所有偶数元素都被删除了。

(A)
FOR indx IN 1 .. l_numbers.COUNT
LOOP
   IF MOD (indx, 2) = 0
   THEN
      l_numbers.delete (indx);
   END IF;
END LOOP;

(B)
FOR indx IN 1 .. l_numbers.COUNT
LOOP
   IF MOD (l_numbers (indx), 2) = 0
   THEN
      l_numbers.delete (indx);
   END IF;
END LOOP;

(C)
DELETE FROM TABLE (l_numbers)
      WHERE MOD (index_value, 2) = 0;
      
(D)
FOR rec IN (SELECT *
              FROM TABLE (l_numbers)
             WHERE MOD (COLUMN_VALUE, 2) = 0)
LOOP
   l_numbers.delete (rec.COLUMN_VALUE);
END LOOP;

论坛徽章:
346
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2018-11-9 10:10 | 显示全部楼层
答案:B
A:  MOD (indx, 2) = 0 这删除的角标为偶数的元素,而不是元素值为偶数的元素
B:  删除的是元素值为偶数的元素,正确
C:  TABLE (l_numbers) 表函数不能直接跟在DELETE语句后,语法不对
D:  rec.COLUMN_VALUE 这是值,不是角标,如果正确写法应该如下:

       DECLARE
    l_numbers   plch_numbers_t  := plch_numbers_t (12, 23, 34, 45, 56, 67, 78, 89, 90, 100);
  BEGIN
     FOR rec IN (SELECT rn
                   FROM (
                          SELECT rownum rn,case when MOD (COLUMN_VALUE, 2) = 0 then 1 else 0 end flag
                          FROM TABLE (l_numbers)
                         )
                  WHERE FLAG = 1
                 )
      LOOP
         l_numbers.delete (rec.rn);
      END LOOP;

     plch_show_numbers ('AFTER DELETE', l_numbers);
  END;

使用道具 举报

回复
论坛徽章:
533
奥运会纪念徽章:垒球
日期: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
 楼主| 发表于 2018-11-10 05:48 | 显示全部楼层
答案B, 2楼得奖。

A: 假如MOD是被应用于集合元素而非其索引值,那么这个选项就对了。这个代码会删除所有索引值为偶数的元素。

B: 这个选项正确地检查了每个索引值的元素是否偶数(除以2之后余数为0)

C: 这个选项会报错:
  "ORA-00903: invalid table name"
你可以用 SQL DELETE 来删除嵌套表中的元素,但是仅当这个嵌套表是表中的一个列。

D: 这个代码块会从集合l_numbers中删除索引值为12, 34, 56, 78, 90 和 100的元素。但是这些索引值并没有定义,所以执行代码块之后你会看到这个输出:

AFTER DELETE
12
23
34
45
56
67
78
89
90
100

使用道具 举报

回复

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

本版积分规则 发表回复

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