我有一些逻辑思考这个任务的麻烦。 因此,任务要求返回字母列表中第一个较大字母的位置。 例如:
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。 不幸的是,我不知道如何将这个想法变成代码。你能给我一些提示/建议吗?谢谢!
答案 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