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

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

[每日一题] PL/SQL Challenge 每日一题:2017-8-8 关联数组

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

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

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

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

作者:Steven Feuerstein

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

哪些选项描述了PL/SQL中的关联数组(associative array, 用INDEX BY语法声明的集合类型)的一个特有的功能,该功能是嵌套表(nested table)和可变数组(varray)不具有的?


(A)
索引值可以是负数。

(B)
和关联数组相关联的构建函数可以用来初始化一个变量。

(C)
索引值可以是字符串。

(D)
当你在集合中定义一个新的索引值时,你不需要调用EXTEND方法。

(E)
当声明该数组的代码块终止时,你不需要明确地删除关联数组中的内容来释放内存。

论坛徽章:
1
2016猴年福章
日期:2016-02-23 09:58:34
发表于 2017-8-12 21:00 | 显示全部楼层
ACDE

说明:
A:关联数组中元素的索引值可以是数字或字符串,可以是负数;
B:关联数组元数存储在内存中,不需要初始化,嵌套表和可变数组存储在数据库中,需要初始化。
C:索引值可以是字符串。
D:原理同B,关联数组元数的曾加不需要extend,而嵌套表和可变数组需用extend
E:对的。

使用道具 举报

回复
论坛徽章:
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-8-15 03:18 | 显示全部楼层
答案ACD, 本期无人得奖。注意E里面提到的功能不是特有的所以不符合题目要求。

A: 是的,这是关联数组特有的功能,而嵌套表和可变数组则不支持。试一下:

DECLARE
   TYPE coll_type IS TABLE OF NUMBER
      INDEX BY PLS_INTEGER;

   coll   coll_type;
BEGIN
   coll (-1) := 1;
END;
/

DECLARE
   TYPE coll_type IS TABLE OF NUMBER;

   coll   coll_type := coll_type ();
BEGIN
   /* 嗯,天哪,我甚至都不知道如何“试图”使用负数索引值。
      你所能做的仅仅是extend然后定义另外一个正整数
    */
   coll.EXTEND;
   coll (-1) := 1;
END;
/

DECLARE
   TYPE coll_type IS ARRAY (5) OF NUMBER;

   coll   coll_type := coll_type ();
BEGIN
   /* 和嵌套表相同
    */
   coll.EXTEND;
   coll (-1) := 1;
END;
/

B: 构建函数(函数名和类型名称一样的函数)仅仅是在嵌套表和可变数组上才能定义和使用。用在关联数组会报错:

declare
   type coll_type is table of number index by pls_integer;
   coll coll_type;
begin   
   coll := coll_type ();
end;
/

PLS-00222: no function with name 'COLL_TYPE' exists in this scope

C: 是的,这是关联数组另一个可爱的功能!

DECLARE
   TYPE coll_type IS TABLE OF VARCHAR2 (100)
      INDEX BY VARCHAR2 (10);

   coll   coll_type;
BEGIN
   coll ('Steven') := 'Excited about PL/SQL';
END;
/

在我漫长的PL/SQL职业生涯中,我有好几次发现这个功能十分有用,可以用来快速确定某个字符串是否被用过。此时,关联数组和IOT(索引组织表)十分相似。下面是实现了这个思路的一个包:

CREATE OR REPLACE PACKAGE string_tracker
IS
   PROCEDURE mark_as_used (variable_name_in IN VARCHAR2);
   FUNCTION string_in_use (variable_name_in IN VARCHAR2) RETURN BOOLEAN;
END string_tracker;
/

CREATE OR REPLACE PACKAGE BODY string_tracker
IS
   SUBTYPE who_cares_t IS BOOLEAN;
   c_does_not_matter   CONSTANT who_cares_t DEFAULT NULL;
   TYPE used_aat IS TABLE OF who_cares_t INDEX BY VARCHAR2 (32767);
   g_names_used        used_aat;

   PROCEDURE mark_as_used (variable_name_in IN VARCHAR2)
   IS
   BEGIN
      g_names_used (variable_name_in) := c_does_not_matter;
   END mark_as_used;

   FUNCTION string_in_use (variable_name_in IN VARCHAR2)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN g_names_used.EXISTS (variable_name_in);
   END string_in_use;
END string_tracker;
/

D:正确。EXTEND仅仅是在嵌套表和可变数组上使用。对于关联数组,直接用就是,下面的代码傻傻地演示了这一点:

DECLARE
   TYPE list_of_names_t IS TABLE OF VARCHAR2 (32767)
                              INDEX BY PLS_INTEGER;

   happyfamily     list_of_names_t;
   l_index_value   PLS_INTEGER;
BEGIN
   happyfamily (1) := 'Eli';
   happyfamily (-15070) := 'Steven';
   happyfamily (3) := 'Chris';
   happyfamily (-2) := 'Veva';
   happyfamily (9999998) := 'Lauren';
   happyfamily (9999999) := 'Loey';
   happyfamily (11111111) := 'Loey';

   DBMS_OUTPUT.put_line (happyfamily.COUNT);

   l_index_value := happyfamily.FIRST;

   WHILE (l_index_value IS NOT NULL)
   LOOP
      DBMS_OUTPUT.put_line (
            'Name at index '
         || l_index_value
         || ' = '
         || happyfamily (l_index_value));

      l_index_value := happyfamily.NEXT (l_index_value);
   END LOOP;
END;
/

E:确实,你不需要明确删除集合中的内容,但这并不是关联数组特有的。对于嵌套表和可变数组也一样。更通常地说,对于PL/SQL块中声明的每个变量或常量都是这样。
注意,如果你在包中声明一个变量或常量,情况就不是这样了。此时该元素的生存范围是你的会话,不是哪个特定的块。所以你就得自己清理,至少在会话关闭之前需要自己清理。

使用道具 举报

回复
论坛徽章:
133
秀才
日期:2015-11-12 17:43:40秀才
日期:2016-02-18 09:15:13秀才
日期:2016-02-18 09:21:30秀才
日期:2016-02-18 09:23:46秀才
日期:2016-02-18 09:24:302016猴年福章
日期:2016-02-18 09:31:30秀才
日期:2016-02-18 09:39:10秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14
发表于 2017-8-15 11:05 | 显示全部楼层
苏大侠,重复了

使用道具 举报

回复
论坛徽章:
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-8-15 21:13 | 显示全部楼层

你都不知道回个贴有多辛苦,刷了一遍又一遍,最后蹦出这么多贴。昨天我就把重复的全删了,没想到今天又全出来了。

使用道具 举报

回复

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

本版积分规则

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