2017-10-18 89 views
0

我对这个任务有一些逻辑思考的麻烦。 因此,任务要求返回字母列表中第一个较大的字母的位置。 例如:打印字符列表中较大的字母的位置

   ABVD -> 3 
      BCDG -> 4 
      CFDE -> 2 

这个任务建议使用lenght,ASCII,并命名为块,功能

原来这就是我到目前为止做:

declare 
x varchar2(10) :='ABFD'; 
BEGIN 
FOR i in 1..length(x) LOOP 
dbms_output.put_line(ASCII(SUBSTR(x, i, 1))); 
END LOOP; 
END; 

我的想法是,以将字母转换为数字:65,66,70,68。该模式是x + 1,并且由于数字70不等于66 + 1,所以程序将返回该数字的位置,即3. 不幸的是,我不知道如何将这个想法变成代码。你能给我一些提示/建议吗?谢谢!

+0

为什么转换为数字?是的,70> 65,但'F'>'A'也是。 –

+0

感谢您的回复!我不知道我们实际上可以做到这一点。 – Chopsticks

回答

1

在问题陈述中,您说过“...使用命名块,功能”。

您的解决方案是一个匿名程序。它不是以任何名称命名的(这就是为什么它被称为“匿名”)。它不是一个函数 - 它不返回任何东西。

我会让你学习文档来理解函数和过程之间的区别,以及如何命名函数或过程。下面我会跟随你的主角,并展示如何修改你的代码,使其成为一个可行的匿名程序。 (在程序中“打印”ind的最终值;当您将其更改为某个功能时,应该为return表示该值,而不是打印它。)

在您发布的代码中,您正在打印字母输入字符串,一个接一个。你甚至没有试图定义或分配给一个整数(字符串中“最高”字母的第一个出现的索引)。这应该在DECLARE块中完成。然后,我们还需要存储“迄今为止”找到的最高字母(以备将来比较)。

的代码可能是这样的:

declare 
x varchar2(10) :='ABFD'; 
ind number := 1; 
max_letter char(1) := substr(x, 1, 1); 
BEGIN 
FOR i in 2..length(x) LOOP 
    if substr(x, i, 1) > max_letter 
    then max_letter := substr(x, i, 1); 
     ind := i; 
    end if; 
END LOOP; 
dbms_output.put_line(ind); 
END; 
/

注意字母可以相互比较直接,没有任何理由将它们转换为数字。

0

纯SQL使用示范条款

with t(str) as 
(select 'ABVD' from dual 
union all select 'BCDG' from dual 
union all select 'CFDE' from dual) 
select str, instr(str, max_chr) ind 
from t 
model 
partition by (rownum rn) 
dimension by (1 dummy) 
measures (str, chr(1) max_chr) 
rules 
iterate (4e3) until (substr(str[1], iteration_number + 2, 1) is null) 
(max_chr[1] = greatest(max_chr[1], substr(str[1], iteration_number + 1, 1))); 

STR   IND 
---- ---------- 
ABVD   3 
BCDG   4 
CFDE   2