PL/SQL Challenge 每日一题:2015-2-10 嵌套表集合类型

[复制链接]
查看11 | 回复9 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2015-2-14 05:24 编辑
(原发表于2010-10-12)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... =typeid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我写了如下未完成的代码块:
DECLARE
TYPE numbers_t IS TABLE OF NUMBER;
l_table numbers_t := numbers_t ();
BEGIN
/*CHANGE*/
IF /*BOOLEAN*/ THEN
DBMS_OUTPUT.PUT_LINE ('TRUE');
END IF;
END;
假设在/*CHANGE*/注释这个地方你可以写所需的任何代码(填充l_table中的元素,或者让它保持为空,等等)
哪些选项包含了布尔表达式,可用来取代/*BOOLEAN*/注释,使得代码块执行之后永远会显示单词 "TRUE" ?

(A)
NVL(l_table.LAST,0) = l_table.COUNT
(B)
l_table.FIRST = 1 or l_table.FIRST IS NULL
(C)
l_table.PRIOR (l_table.FIRST) IS NULL
(D)
l_table.LIMIT IS NULL
(E)
l_table.TRIM IS NULL

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
猜 ABCD 吧
trim没有返回值吧,如果E选项正确的话,那么需要有一个trim函数,调用之后有返回值,不知道/*CHANGE*/部门怎么写才能达到目的,请高手指点下~~~~~
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
/*CHANGE*/ 不写任何代码, A、B、C、D都能返回TRUE,但E里的TRIM是过程而非函数,是没有返回值的,会导致语法错误。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
A
这个没有问题,即便你这样赋值: l_table(1.1):=40; 都没有问题
(B)
也没有问题,first肯定是从1开始的,要不然就是空,不管有没有有值
(C)也没有问题,感觉无论如何都是null
(D):只用在varray数组里面,不能用在这,所以也是空的。即便赋值也是,他的作用是返回数组的最大长度
(E):有trim函数,是去除嵌套表最后一个值,但是直接判断是否为空,不能这么用所以是错的。



回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
CD ;C中 l_table.PRIOR (l_table.FIRST) 为null;D中limit用于嵌套表和index by 都返回null;

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案CD,5楼得奖。
A: 嵌套表在初始化时是密集填充的,但是通过DELETE方法它们也可能变得稀疏。结果,集合中的最高索引值就可能比元素总数还大。
B: 嵌套表在初始化时是密集填充的,但是通过DELETE方法它们也可能变得稀疏。结果,最低索引值可能为NULL(当嵌套表为空时),或者也可能是 1 和2**31 - 1之间的任意正整数。
C: FIRST方法返回定义的最低索引值,或者在集合为空的情况下返回NULL。PRIOR只有一个参数,返回的是该参数的前一个有定义的索引值,如果参数已经是最低索引值则返回NULL。
D: LIMIT返回的是一个可变数组(VARRAY)中最大的元素个数。如果集合为嵌套表或者关联数组,这个方法永远返回NULL。
E: TRIM方法是一个过程,它从尾部去除制定个数的元素。它只能被用于嵌套表和可变数组。如果你试图像本选项那样使用TRIM, 你会看到这个错误:
PLS-00222: no function with name 'TRIM' exists in this scope

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
newkid 发表于 2015-2-13 01:45
答案CD,5楼得奖。
A: 嵌套表在初始化时是密集填充的,但是通过DELETE方法它们也可能变得稀疏。结果,集 ...

版主,请问 A/B 选项错在哪里了呢?

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
四十五度向上 发表于 2015-2-13 08:34
版主,请问 A/B 选项错在哪里了呢?

DECLARE
TYPE numbers_t IS TABLE OF NUMBER;
l_table numbers_t := numbers_t ();
BEGIN
l_table.extend;
l_table(1):=10;
l_table.extend;
l_table(2):=20;
l_table.extend;
l_table(3):=30;
l_table.delete(2);
DBMS_OUTPUT.PUT_LINE (l_table.COUNT);
DBMS_OUTPUT.PUT_LINE (l_table.LAST);
IF NVL(l_table.LAST,0) = l_table.COUNT THEN
DBMS_OUTPUT.PUT_LINE ('TRUE');
END IF;
END;
DECLARE
TYPE numbers_t IS TABLE OF NUMBER;
l_table numbers_t := numbers_t ();
BEGIN
l_table.extend;
l_table(1):=10;
l_table.extend;
l_table(2):=20;
l_table.extend;
l_table(3):=30;
l_table.delete(1);
DBMS_OUTPUT.PUT_LINE (l_table.COUNT);
DBMS_OUTPUT.PUT_LINE (l_table.first);
IF l_table.FIRST = 1 or l_table.FIRST IS NULL THEN
DBMS_OUTPUT.PUT_LINE ('TRUE');
END IF;
END;
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
sse_zero 发表于 2015-2-13 10:32
DECLARE
TYPE numbers_t IS TABLE OF NUMBER;
l_table numbers_t := numbers_t ();

看来是我理解有偏差
/*CHANGE*/什么都不写的话, A/B选项也是对的吧?
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
/*CHANGE*/什么都不写的话, A/B选项是对的。
楼主要求的是在/*CHANGE*/中写所需的任何代码是输出为‘TRUE’,所以严格来说A,B,C,D 都是对的。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行