PL/SQL Challenge 每日一题:2015-9-10 管道表函数

[复制链接]
查看11 | 回复2 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
注:本题执行环境为12C及更高版本

我执行了下列语句:
CREATE OR REPLACE PACKAGE plch_pkg
AUTHID DEFINER
IS
TYPE plch_letters_t IS TABLE OF VARCHAR2 (1)
INDEX BY PLS_INTEGER;
TYPE plch_pairs_rt IS RECORD
(
idx
INTEGER,
one_letter VARCHAR2 (1)
);
TYPE plch_pairs_t IS TABLE OF plch_pairs_rt
INDEX BY PLS_INTEGER;
END;
/
哪些选项执行之后会显示如下文本?
E
D
C
B
A
(A)
DECLARE
l_letters plch_pkg.plch_letters_t;
BEGIN
FOR indx IN 1 .. 5
LOOP
l_letters (indx) := SUBSTR ('EDCBA', indx, 1);
END LOOP;
FOR rec IN (SELECT COLUMN_VALUE FROM TABLE (l_letters)

ORDER BY ROWNUM DESC)
LOOP
DBMS_OUTPUT.put_line (rec.COLUMN_VALUE);
END LOOP;
END;
/
(B)
DECLARE
l_letters plch_pkg.plch_letters_t;
BEGIN
FOR indx IN 1 .. 5
LOOP
l_letters (indx) := SUBSTR ('EDCBA', indx, 1);
END LOOP;
FOR rec IN (SELECT COLUMN_VALUE

FROM TABLE (l_letters)

ORDER BY COLUMN_VALUE)
LOOP
DBMS_OUTPUT.put_line (rec.COLUMN_VALUE);
END LOOP;
END;
/
(C)
DECLARE
l_letters plch_pkg.plch_pairs_t;
BEGIN
FOR indx IN 1 .. 5
LOOP
l_letters (indx).idx := indx;
l_letters (indx).one_letter := SUBSTR ('EDCBA', indx, 1);
END LOOP;
FOR rec IN (SELECT one_letter

FROM TABLE (l_letters)

ORDER BY idx)
LOOP
DBMS_OUTPUT.put_line (rec.one_letter);
END LOOP;
END;
/
(D)
DECLARE
l_letters plch_pkg.plch_letters_t;
l_index PLS_INTEGER;
BEGIN
FOR indx IN 1 .. 5
LOOP
l_letters (indx) := SUBSTR ('EDCBA', indx, 1);
END LOOP;
l_index := l_letters.FIRST;
WHILE l_index IS NOT NULL
LOOP
DBMS_OUTPUT.put_line (l_letters (l_index));
l_index := l_letters.NEXT (l_index);
END LOOP;
END;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
我选CD
没有12c,估计现在支持这种直接返回了。
A.B的结果估计都是ABCDE
C按照idx排序,D规规矩矩的按顺序返回数据,都是正确的。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案CD, 2楼得奖。
A:
ORDER BY ROWNUM 本身在通常情况下很可能会按正确顺序输出数据,但是加上DESC之后,它几乎百分百会给出错误顺序。
B: 现在我加上了ORDER BY,所以ORACLE会保证一个可预见的数据获取顺序——但这个顺序是错的!我要的是反字母序,而不是字母顺序。这里还提出一个问题:没有任何一种方法可以通过TABLE操作符来按照集合填充的顺序来访问其索引值。
C: 当你需要确保数据的获取顺序符合索引顺序,这就是你应该做的:为集合中的每个元素加入一个属性或者字段来包含这个索引值(或者更通常地说是所需的顺序)。然后就可以在SELECT里面访问它。
D: 完全在PL/SQL里做,集合的顺序是确定的,可靠的。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行