PL/SQL Challenge 每日一题:2014-9-11 拆分字符串

[复制链接]
查看11 | 回复9 | 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已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
哪些选项创建了一个过程,使得这个代码块执行之后:
BEGIN
plch_show_chars ('abc');
END;
/
下列文本会被显示?
a
b
c

(A)
CREATE OR REPLACE PROCEDURE plch_show_chars (
string_in IN VARCHAR2)
IS
BEGIN
FOR indx IN 1 .. LENGTH (string_in)
LOOP
DBMS_OUTPUT.put_line (SUBSTR (string_in, indx, 1));
END LOOP;
END;
/
(B)
CREATE OR REPLACE PROCEDURE plch_show_chars (
string_in IN VARCHAR2)
IS
BEGIN
FOR indx IN REVERSE 1 .. LENGTH (string_in)
LOOP
DBMS_OUTPUT.put_line (SUBSTR (string_in, -1 * indx));
END LOOP;
END;
/
(C)
CREATE OR REPLACE PROCEDURE plch_show_chars (
string_in IN VARCHAR2)
IS
BEGIN
FOR indx IN REVERSE 1 .. LENGTH (string_in)
LOOP
DBMS_OUTPUT.put_line (SUBSTR (string_in, -1 * indx, 1));
END LOOP;
END;
/
(D)
CREATE OR REPLACE PROCEDURE plch_show_chars (
string_in IN VARCHAR2)
IS
BEGIN
FOR rec IN (SELECT SUBSTR (string_in, LEVEL, 1) onechar

FROM DUAL

CONNECT BY LEVEL <= LENGTH (string_in))
LOOP
DBMS_OUTPUT.put_line (rec.onechar);
END LOOP;
END;
/


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
acd,substr第3个参数默认当前指定位置起到最后
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层


OO也来捡章了
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
visual2006 发表于 2014-9-16 08:58
OO也来捡章了

你可以详细说说,没准也能分到个章呢
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
能说的都被OO说了。。早起的鸟儿有章拿啊。。。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
风铃中の鬼 发表于 2014-9-16 09:03
能说的都被OO说了。。早起的鸟儿有章拿啊。。。

我不参与拣“每日一题”章
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
那只能说卢总早起哈


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
选个ACD


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案A,C,D;
A正确;循环遍历a,b,c并输出;
B错误;REVERSE从大到小,遍历出来的数字3,2,1;substr(string_in,-1*indx)第一次截取的位置从-3(从右向左数三位),那就是本身‘abc';第二次截取的位置从-2,那输出就是'bc';第三次是'a';
C正确;指定了每次只截取一位;substr(string_in,-1*indx,1)第一次截取的位置从-3(从右向左数三位),那就是本身‘abc',只截取一位为’a';第二次截取的位置从-2,只截取一位为’b';最后就是'a';
D正确;循环遍历1,2,3层,分别取出数字'a','b','c';
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案ACD,9楼得奖。
A: 这个过程的方法是非常直观的,它用一个FOR循环调用SUBSTR,每次取出一个字符并显示。
B: 这个过程把REVERSE倒序循环和SUBSTR的负数起始参数结合在一起,本来是可以的,但是我漏掉了SUBSTR的第三个参数,所以SUBSTR返回的是字符串中的余下部分,我们看到的是这样的输出:
abc
bc
c
C: 这就好多了,我用了REVERSE和负数起始参数,但是每次只取一个字符。
D: (不推荐)哦页,产品级质量的代码!嗯,我遵从了TOM KYTE的建议,尽量用SQL, 对吧?不对。TOM从来没建议这么做——这对需求来说简直复杂得很荒谬。我用了LEVEL来从“基础”的DUAL表来动态产生数据行。它也能行,但是只会令维护代码的人头疼。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行