在字符列表中打印较大字母的位置

时间:2017-10-18 03:42:29

标签: sql database oracle plsql

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

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

此任务建议使用lenght,ascii和named block,function

所以这就是我到目前为止所做的:

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。 不幸的是,我不知道如何将这个想法变成代码。你能给我一些提示/建议吗?谢谢!

2 个答案:

答案 0 :(得分: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;
/

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

答案 1 :(得分: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