PL/SQL Challenge 每日一题:2014-11-4 MULTISET UNION操作符

[复制链接]
查看11 | 回复2 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
(原发表于2010-8-25)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我创建了如下的嵌套表:
CREATE OR REPLACE TYPE parts_nt IS TABLE OF VARCHAR2 (100)
/
每个选项提供了一个PL/SQL块的执行部分,声明部分如下:
DECLARE
l_parts1 parts_nt := parts_nt ('Part1', 'Part2', 'Part3');
l_parts2 parts_nt := parts_nt ('Part3', 'Part5', 'Part6');
l_unionparts_nt;
哪些选项所提供的执行代码追加到这个声明之后并执行,会显示:
Count.Last = 6.Part6

(A)
BEGIN
l_union := l_parts1;
FOR indx IN 1 .. l_parts2.COUNT
LOOP
l_union (indx) := l_parts2 (indx);
END LOOP;
DBMS_OUTPUT.
put_line (
'Count.Last = ' || l_union.COUNT || '.' || l_union (l_union.LAST));
END;
/
(B)
BEGIN
l_union := l_parts1;
l_union.EXTEND (l_parts2.COUNT);
FOR indx IN 1 .. l_parts2.COUNT
LOOP
l_union (indx) := l_parts2 (indx);
END LOOP;
DBMS_OUTPUT.
put_line (
'Count.Last = ' || l_union.COUNT || '.' || l_union (l_union.LAST));
END;
/
(C)
BEGIN
l_union := l_parts1 MULTISET UNION l_parts2;
DBMS_OUTPUT.
put_line (
'Count.Last = ' || l_union.COUNT || '.' || l_union (l_union.LAST));
END;
/
(D)
BEGIN
l_union := l_parts1 MULTISET UNION DISTINCT l_parts2;
DBMS_OUTPUT.
put_line (
'Count.Last = ' || l_union.COUNT || '.' || l_union (l_union.LAST));
END;
/
(E)
BEGIN
l_union := l_parts1;
FOR indx IN 1 .. l_parts2.COUNT
LOOP
l_union.EXTEND;
l_union (l_union.LAST) := l_parts2 (indx);
END LOOP;
DBMS_OUTPUT.
put_line (
'Count.Last = ' || l_union.COUNT || '.' || l_union (l_union.LAST));
END;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
C/E
A:初始化 L_UNION=L_PARTS1,for循环后,L_UNION=L_PARTS2,输出 3.Part6
B:首先 L_UNION=L_PARTS1,扩展3个位置,for循环的结果是L_UNION有6个元素,前三个是L_PARTS2的元素,后三个为null,输出 6.null
C:使用 MULTISET UNION 对两个嵌套表集合求并集,没有去除重复元素,输出 6.Part6
D:使用 MULTISET UNION DISTINCT 对两个嵌套表集合求并集,去除结果中的重复元素,输出 5.Part6
E:首先L_UNION=L_PARTS1,for循环对每个L_PARTS2元素扩展一次,使用新扩展的位置存放L_PARTS2的元素,结果是L_UNION包含了L_PARTS1和L_PARTS2的全部元素,有重复,输出 6.Part6

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案CE,2楼得奖。
A: 在这个代码块中,我试图用暴力法来合并两个嵌套表。也即,我没有使用MULTISET UNION, 而是先将 l_parts1 的内容拷贝到 l_union。但是我没有扩充l_union,仅仅是循环访问l_parts2中的每个元素,赋值给l_union中相应的索引值,覆盖了原有的数据(来自l_parts1的数据)。结果怎么样?嵌套表l_union包含三个元素而不是六个。
B: 在这个代码块中,我用了暴力法来合并两个嵌套表。也即,我没有使用MULTISET UNION, 而是先将 l_parts1 的内容拷贝到 l_union。然后我将l_union扩充了三个索引值的位置(l_parts2有三个元素)。然后我遍历l_parts2中的每个元素。不幸的是,在循环中,我只是将l_parts2中位于索引位置1至3的元素赋予了l_union中相应的索引值,覆盖了原有的数据(来自l_parts1的数据)。结果怎么样?嵌套表l_union包含三个元素,但是最后三个(索引值4至6)是NULL。
C: 在这个选项中,我利用了MULTISET UNION 来将两个嵌套表合并到一起。这比写循环好多了。既然我在UNION中没有包含DISTINCT关键字,重复元素就不会被移除。具体地说,Part3 在l_union中出现了两次,元素个数为6, 最后一个元素为 Part6。
D: 类似于C, 但是我在UNION中包含了DISTINCT关键字,于是重复元素被移除。具体地说,Part3 在l_union中只出现一次,元素个数仅仅为5。
E: 在这个块中,我采用了一种暴力法。首先,我将 l_parts1 的内容拷贝到 l_union。然后,针对 l_parts2中的每个元素,我将l_union 扩展一个位置,将这个来自l_parts2的元素加入到l_union. 结果就是l_union有6个元素,最后一个是Part6。因此这是一个正确答案,但绝对不是优化的事先方法。当你需要合并两个嵌套表时,你应该使用 MULTISET UNION操作符。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行